2012-02-14 34 views
5

Estaba tratando de automatizar la construcción de un modelo final. Me gustaría combinar predictores de dos modelos separados en un modelo final. Jugué con update.formula() pero me di cuenta de que puedo actualizar una llamada lmfit $ antigua a una nueva, por ejemplo, update.formula(lmfit$call,lmfitnew$call). aquí i necesidad de variables de selección de la cereza de ambos modelos y correr la final¿Cómo podemos combinar predictores de dos modelos lineales diferentes en uno?

lmfit1 <- lm(y~ x1+x2+x3, data = modelready) 
best.ngc_fit <- stepAIC(lmfit1, direction="backward") 
best.ngc_fit$call 

lm(formula = y~ x2+x3, data = modelready) 

lmfit2 <- lm(y ~ a+b+c+d+f, data=fcstmodel) 
best.fcst_fit <- stepAIC(lmfit2, direction ="backward") 
best.fcst_fit$call 

lm(formula = y~ a+c+d+f, data = fcstmodel) 

Esto es lo que me gustaría tener en mi modelo final

best.full_fit <- lm(y~x2+x3+a+c+d+f, data = fullmodel) 

puedo hacerlo manualmente sin ningún problema, pero me gustaría automatizarlo para que todo el proceso sea menos tedioso.

Cualquier ayuda será muy apreciada

+0

¿Por qué no combinar los datos e intentar crear primero un modelo holístico? Estableciendo x1, x2, x3 = 0 donde a, b, c, d, f> 0, y el inverso. es decir, utilizar un data.frame que contenga las columnas x1, x2, x3, x4, a, b, c, d, f donde las variables se llenan 0 según corresponda? –

+0

Brandon, gracias por su contribución, este modelo fue escrito originalmente en SAS. La forma en que se estructura el modelo es combinando dos mejores modelos. Los predictores del primer mejor modelo provienen del índice de precios relacionados con las variables macroeconómicas (por ejemplo, índice de precios de la vivienda), los predictores del segundo mejor modelo están relacionados con el índice laboral, como la tasa de desempleo, y así sucesivamente. No tengo libertad para cambiar la estructura básica del flujo de datos en el modelo. Si hago eso, no puedo vender esto a la alta gerencia. Trabajo para un BANCO líder en los EE. UU., Muchas cosas que hacemos no tienen sentido para nosotros y también para el público. – Anand

Respuesta

4

Para una manipulación más avanzada de fomulas puede usar el paquete Formula.

formula(as.Formula(terms(lm1),formula(Formula(terms(lm2)), lhs=0)), collapse=TRUE) 

y ~ X1 + X2 + X3 + (X5 + X7) 
5

Si esto es sólo una cuestión de la extracción de los componentes de cada modelo y combinarlos en una nueva matriz de diseño, a continuación, el siguiente debería funcionar, independientemente del hecho de que utilizó stepAIC:

dfrm <- data.frame(y=rnorm(100), replicate(7, rnorm(100))) 
lm1 <- lm(y ~ X1+X2+X3, dfrm) 
lm2 <- lm(y ~ X5+X7, dfrm) 
lm1.fm <- attr(terms(lm1), "term.labels") 
lm2.fm <- attr(terms(lm2), "term.labels") 
lm3.fm <- as.formula(paste("y ~ ", paste(c(lm1.fm, lm2.fm), collapse= "+"))) 
lm3 <- lm(lm3.fm, dfrm) 

para fijar las ideas, aquí tenemos

> names(dfrm) 
[1] "y" "X1" "X2" "X3" "X4" "X5" "X6" "X7" 
> lm3.fm 
y ~ X1 + X2 + X3 + X5 + X7 

Ver help(terms.object) para obtener más información sobre la AMS t vuelve. Con su ejemplo, deberá reemplazar lm1 con best.ngc_fit y lm2 con best.fcst_fit.

+0

Christophe, gracias señor. Eso funcionó muy bien y me ayudó a aprender profundizando en el objeto creado por lm(). Visitó su sitio web y se dio cuenta de que ha sido un excelente profesor impartiendo clases R de resistencia. Por favor, avíseme si tiene alguna clase en línea. Gracias otra vez. – Anand

+0

Me alegra saber que esto lo ayuda a profundizar en los objetos R. Recomiendo mirar la ayuda en línea de R para comprobar lo que devuelve una función, así como emitir un simple 'str (su.objeto)' como un aviso R. Gracias por su comentario sobre mis cursos (las diapositivas más recientes son [aquí] (http://www.aliquote.org/cours/2012_biomed/), pero esto es en francés, probablemente encontrará muchos otros buenos/mejores tutoriales. buscando en Google un poco :-) – chl

Cuestiones relacionadas