Pregunta:
¿Cómo agregar términos de segundo orden al modelo en R?
Tae-Sung Shin
2012-04-06 18:07:56 UTC
view on stackexchange narkive permalink

Mi mydata de datos consta de columnas de x1, x2, .., x100, y en R. Pero estoy pensando en un modelo lineal con términos de segundo orden como y ~ x1 ^ 2 + x2 ^ 2 + x1 * x2 + ... ¿cómo lo logro dentro de la fórmula o de cualquier otra manera en R?

Cuando intenté arriba, mi modelo pls ignoró todo el segundo condiciones de pedido. ¿Tengo que crear esas columnas manualmente?

Tres respuestas:
conjugateprior
2012-04-06 18:25:04 UTC
view on stackexchange narkive permalink

La documentación de fórmulas para R muestra cómo hacer esto. En resumen, usa poly () . Por ejemplo, haga algunos datos cuadráticos:

  x <- rnorm (100) y <- x + x ** 2 * 0.5 + rnorm (100)  

Ahora ajusta esto usando un polinomio de segundo orden (es decir, x y x ** 2 ) así

  mod <- lm ( y ~ poly (x, 2))  

Tenga en cuenta que esto se ajustará a un polinomio ortogonal , por lo que no recuperará 1 y 0.5 como los coeficientes en el generando distribución. Si por alguna razón lo desea, use poly (x, 2, raw = TRUE) . En general, no lo hace por razones de estabilidad, así que quédese con la versión preparada.

También hay polym como en: lm (y ~ polym (x, z , grado = 2) para un modelo con un conjunto completo de variables cruzadas, que es un poco más complicado de interpretar, pero presumiblemente no es importante con cientos de variables.

Gracias. Pero tengo 100 predictores y ya probé poli. No funciona bien con varios predictores; obtengo una serie de errores cuando uso varios predictores con poli.
¿Qué significa "no funciona bien"?
Como dije, obtengo una serie de errores.
Estaba preguntando qué eran.
Para automatizar `poly`s separados para todas las variables, puede construir la fórmula. Esto es feo pero parece funcionar: `forma <- eval (paste (" y ~ ", paste (paste ('poly (', names (data), ', 2)', sep = ''), collapse =" + "))); mod <- lm (forma) `
Gracias. El truco que hiciste funciona muy bien, excepto que no produce términos de interacción. Pero creo que lo entiendo por lo que hiciste con la manipulación de cuerdas.
Es cierto, no hay interacciones, pero te haces una idea de la idea de la evaluación de la cadena ... El 'problema' con la interfaz de la fórmula en R es que espera que conozcas un pequeño número de variables por nombre. Así que aquí tenemos que pasar por algunos obstáculos cuando esa no es la forma de su problema.
Es más fácil si lo hace `pegando` y luego use` as.formula` en la cadena de caracteres resultante ...
Stéphane Laurent
2012-04-06 18:17:04 UTC
view on stackexchange narkive permalink

Escriba:

  lm (y ~ x1 + x2 + I (x1 * x2) + I (x1 ^ 2) + ...)  
Muchas gracias. Pero una cosa más: tengo 100 variables para agregar como lo que describe. ¿Hay alguna forma de generar esos términos automáticamente? Gracias de nuevo.
El operador I () le dice a R que lo trate como matemático en lugar de tratarlo como una interacción y términos lineales.
civilstat
2018-01-07 01:01:40 UTC
view on stackexchange narkive permalink

En principio, le mostramos cómo hacerlo, ilustrado en un conjunto de datos más pequeño con solo 10 predictores:

  # Hacer datos falsos
mydata = as.data.frame (matriz (rnorm (1100), 100))
nombres (mydata) = c (paste0 ("x", 1:10), "y")

# Forme una matriz que contenga todas las columnas predictoras pero no y
x = as.matrix (mydata [, 1:10])
# Utilice poly () para formar todas las interacciones bidireccionales y términos de segundo orden
x2 = poli (x, grado = 2, crudo = VERDADERO)
# Volver a guardar como un marco de datos que incluye y
mydata2 = as.data.frame (cbind (x2, y = mydata $ y))
# Ajustar el modelo lineal completo
lm2 = lm (y ~., datos = mydata2)
 

Sin embargo, tiene 100 predictores. En mi experiencia, con más de 10-15 predictores, R generalmente no puede asignar suficiente memoria para la matriz que contiene cada interacción bidireccional. Obtendrá errores inútiles o R simplemente fallará.

Si es así, considere si realmente necesita todas interacciones bidireccionales. Tal vez solo un subconjunto tenga sentido. Por ejemplo, puede usar poly () como se indicó anteriormente para formar todas las interacciones bidireccionales dentro de un subconjunto de x, luego nuevamente para formar interacciones entre otro subconjunto de x, pero no tener interacciones entre esos subconjuntos .



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...