Cómo escribir una fórmula de modelo lineal con 100 variables en R

22

¿Hay una manera fácil en R de crear una regresión lineal sobre un modelo con 100 parámetros en R? Digamos que tenemos un vector Y con 10 valores y un marco de datos X con 10 columnas y 100 filas. En notación matemática, escribiría Y = X[[1]] + X[[2]] + ... + X[[100]]. ¿Cómo escribo algo similar en la sintaxis R?

cristiano
fuente
1
¿hay 100 o 1000? Además, normalmente las columnas serían las variables y las filas serían observaciones (parece que se invierte aquí)
Macro
100 el 0 extra fue un error tipográfico
Christian
2
De Verdad? ¿Seguro que quieres hacer esto? Me preocuparía el sobreajuste y la correlación entre las combinaciones lineales de los predictores. No solo eso, con 100 predictores sino solo 10 observaciones, tienes la regresión lineal no funcionará en absoluto. p>n
Aaron - Restablece a Mónica

Respuestas:

29

Prueba esto

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)
danas.zuokas
fuente
44
Y si quieres, por ejemplo, todas las interacciones de segundo orden, puedes escribir y ~ . + .^2. Y así.
Lutz Prechelt
3
Y si solo desea algunas de las interacciones de segundo orden, algo así y ~ . + .:x1le dará las interacciones de cada variable (excepto x1) con x1. Y así; entiendes la idea.
Lutz Prechelt
21

Grandes respuestas!

Agregaría eso de forma predeterminada, invocar formulaa data.framecrea una fórmula aditiva para hacer retroceder la primera columna sobre las otras.

Entonces, en el caso de la respuesta de @ danas.zuokas, incluso puedes hacer

lm(df)

que se interpreta correctamente

gui11aume
fuente
Aún así, esta respuesta no funciona si desea mezclar en términos de interacción. El tuyo lo hace (+1).
gui11aume
66
Estoy continuamente asombrado de lo sobrecargados que están la mayoría de Rlos operadores :)
Macro
19

Si cada fila es una observación y cada columna es un predictor, de modo que es un vector de longitud y es una matriz ( en este caso), puede hacerlo conn X n × p p = 100YnXn×pp=100

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

Si hay otras columnas que no desea incluir como predictores, deberá eliminarlas Xantes de usar este truco o usar -en la fórmula del modelo para excluirlas. Por ejemplo, si desea excluir el 67o predictor (que tiene el nombre correspondiente x67), entonces podría escribir

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

Además, si desea incluir interacciones, etc., deberá agregarlas manualmente como (por ejemplo)

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

o asegúrese de que se ingresen como columnas de X.

Macro
fuente
19

También puede usar una combinación de las funciones formulay paste.

Los datos de configuración : Imaginemos que tenemos un hoja.de.datos que contiene las variables de predicción x1a x100y la variable dependiente y, sino que también es una variable estorbo asdfasdf. Además, las variables predictoras se organizan en un orden tal que no todas son contiguas en el 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 también que tiene una cadena que contiene los nombres de las variables predictoras. En este caso, esto se puede crear fácilmente usando la pastefunción, pero en otras situaciones, grepo se puede usar algún otro enfoque para obtener esta cadena.

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

Aplicar enfoque : luego podemos construir una fórmula de la siguiente manera:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • el collapseargumento se inserta +entre las variables predictoras
  • formulaconvierte la cadena en un objeto de fórmula de clase adecuada para la lmfunción.

De manera más general, utilizo la siguiente función con bastante regularidad cuando deseo suministrar las variables predictoras como vector de nombres de variables.

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)

}

P.ej,

regression("y", PredictorVariables, Data)
Jeromy Anglim
fuente
2
+1. Yo uso esta técnica todo el tiempo. Ocasionalmente, sin embargo, tener la fórmula almacenada en una variable causa problemas. Consulte stackoverflow.com/a/7668846/210673 para do.callevaluar la fórmula antes de llamar lm.
Aaron - Restablece a Mónica