Como escrever uma fórmula de modelo linear com 100 variáveis ​​em R

22

Existe uma maneira fácil em R criar uma regressão linear sobre um modelo com 100 parâmetros em R? Digamos que temos um vetor Y com 10 valores e um quadro de dados X com 10 colunas e 100 linhas. Em notação matemática, eu escreveria Y = X[[1]] + X[[2]] + ... + X[[100]]. Como escrevo algo semelhante na sintaxe R?

cristão
fonte
1
existem 100 ou 1000? Além disso, você normalmente tem as colunas são as variáveis e as linhas sejam observações (parece que é revertida aqui)
Macro
100 o 0 extra foi um erro de digitação
Christian
2
Sério? Você tem certeza de que quer fazer isso? Eu ficaria preocupado com o ajuste excessivo e a correlação entre combinações lineares dos preditores. Não só isso, com 100 preditores, mas apenas 10 observações, você tem regressão linear não vai funcionar. p>n
Aaron - Restabelece Monica

Respostas:

29

Tente isto

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)
danas.zuokas
fonte
4
E se você quiser, digamos, todas as interações de segunda ordem, você pode escrever y ~ . + .^2. E assim por diante.
Lutz Prechelt
3
E se você quiser apenas algumas das interações de segunda ordem, algo como y ~ . + .:x1você obterá as interações de cada variável (exceto x1) com x1. E assim por diante; Você entendeu a ideia.
Lutz Prechelt
21

Ótimas respostas!

Eu acrescentaria que, por padrão, chamar formulaum data.framecria uma fórmula aditiva para regredir a primeira coluna para as outras.

Então, no caso da resposta de @ danas.zuokas você pode até fazer

lm(df)

que é interpretado corretamente.

gui11aume
fonte
Ainda assim, esta resposta não funcionará se você desejar misturar em termos de interação. O seu faz (+1).
gui11aume
6
Eu estou constantemente espantado em como sobrecarregado a maioria dos Roperadores 's são :)
Macro
19

Se cada linha é uma observação e cada coluna é um preditor, de modo que é um vetor de comprimento e é uma matriz ( nesse caso), você pode fazer isso comn X n × p p = 100YnXn×pp=100

Z = as.data.frame(cbind(Y,X))
lm(Y ~ .,data=Z)

Se houver outras colunas que você não deseja incluir como preditores, será necessário removê-las Xantes de usar esse truque ou usar -a fórmula do modelo para excluí-las. Por exemplo, se você quiser excluir o 67º preditor (que tem o nome correspondente x67), poderá escrever

lm(Y ~ .-x67,data=Z)

Além disso, se você deseja incluir interações, etc., precisará adicioná-las manualmente como (por exemplo)

lm(Y ~ .+X[,1]*X[,2],data=Z)

ou verifique se eles foram inseridos como colunas de X.

Macro
fonte
19

Você também pode usar uma combinação das funções formulae paste.

Dados de configuração : Vamos imaginar que temos um data.frame que contém as variáveis de previsão x1para x100e nossa variável dependente y, mas que há também uma variável incômodo asdfasdf. Além disso, as variáveis ​​preditoras são organizadas em uma ordem para que não sejam todas contíguas no data.frame.

Data <- data.frame(matrix(rnorm(102 * 200), ncol=102))
names(Data) <- c(paste("x", 1:50, sep=""), 
    "asdfasdf", "y", paste("x", 51:100, sep=""))

Imagine também que você tenha uma sequência contendo os nomes das variáveis ​​preditoras. Nesse caso, isso pode ser criado facilmente usando a pastefunção, mas em outras situações, grepou alguma outra abordagem pode ser usada para obter essa sequência.

PredictorVariables <- paste("x", 1:100, sep="")

Aplicar abordagem : podemos então construir uma fórmula da seguinte maneira:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • o collapseargumento é inserido +entre as variáveis ​​preditoras
  • formulaconverte a string em um objeto de fórmula de classe adequado para a lmfunção.

De maneira mais geral, uso a função a seguir com bastante regularidade quando quero fornecer as variáveis ​​preditoras como vetor de nomes de variáveis.

regression <- function(dv, ivs, data) {
    # run a linear model with text arguments for dv and ivs
    iv_string <- paste(ivs, collapse=" + ")
    regression_formula <- as.formula(paste(dv, iv_string, sep=" ~ "))
    lm(regression_formula, data)

}

Por exemplo,

regression("y", PredictorVariables, Data)
Jeromy Anglim
fonte
2
+1. Eu uso essa técnica o tempo todo. Ocasionalmente, no entanto, ter a fórmula armazenada em uma variável causa problemas. Consulte stackoverflow.com/a/7668846/210673 para obter o uso da do.callavaliação da fórmula antes de chamar lm.
Aaron - Restabelece Monica