use stepAIC en una lista de modelos

Quiero hacer una regresión gradual usando AIC en una lista de modelos lineales. La idea es utilizar e una lista de modelos lineales y luego aplicar stepAIC en cada elemento de la lista. Fracasa

Hola chicos, intenté rastrear el problema. Creo que encontré el problema. Sin embargo, no entiendo la causa. Pruebe el código para ver la diferencia entre tres casos.

require(MASS)
n<-30 
x1<-rnorm(n, mean=0, sd=1) #create rv x1 
x2<-rnorm(n, mean=1, sd=1)
x3<-rnorm(n, mean=2, sd=1)
epsilon<-rnorm(n,mean=0,sd=1) # random error variable 
dat<-as.data.frame(cbind(x1,x2,x3,epsilon)) # combine to a data frame
dat$id<-c(rep(1,10),rep(2,10),rep(3,10)) 
# y is combination from all three x and a random uniform variable
dat$y<-x1+x2+x3+epsilon 
# apply lm() only resulting in a list of models
dat.lin.model.lst<-lapply(split(dat,dat$id),function(d) lm(y~x1+x2+x3,data=d)) 
stepAIC(dat.lin.model.lst[[1]]) # FAIL!!!
# apply function stepAIC(lm())-  works
dat.lin.model.stepAIC.lst<-lapply(split(dat,dat$id),function(d) stepAIC(lm(y~x1+x2+x3,data=d))) 
# create model for particular group with id==1
k<-which(dat$id==1) # manually select records with id==1
lin.model.id1<-lm(dat$y[k]~dat$x1[k]+dat$x2[k]+dat$x3[k]) 
stepAIC(lin.model.id1) # check stepAIC - works!

Estoy bastante seguro de que stepAIC () necesita los datos originales de data.frame "dat". Eso es lo que estaba pensando antes. (Espero tener razón en eso) Pero no hay ningún parámetro en stepAIC () donde pueda pasar el marco de datos original. Obviamente, para modelos simples que no están incluidos en una lista, es suficiente para pasar el modelo. (últimas tres líneas en el código) Así que me pregunto:
P1: ¿Cómo sabe stepAIC dónde encontrar los datos "dat" originales (no solo los datos del modelo que se pasan como parámetro)?
P2: ¿Cómo puedo saber que hay otro parámetro en stepAIC () que no se menciona explícitamente en las páginas de ayuda? (tal vez mi inglés es demasiado malo para encontrar)
P3: ¿Cómo puedo pasar ese parámetro a stepAIC ()?

Debe estar en algún lugar del entorno de la función de aplicación y transmitir los datos. O lm () o stepAIC () y el puntero / enlace a los datos sin procesar deben perderse en alguna parte. No entiendo bien lo que hace un entorno en R. Para mí fue como aislar las variables locales de las globales. Pero tal vez sea más complicado. ¿Alguien que me pueda explicar eso con respecto al problema anterior? Honestamente, no leo mucho de laR documentación. Cualquier mejor comprensión me ayudaría. Gracias

ANTIGUO Tengo datos en un marco de datos df que se pueden dividir en varios subgrupos. Para ese propósito, creé un ID de grupo llamado df $ id. lm () devuelve el coeficiente como se esperaba para el primer subgrupo. Quiero hacer una regresión gradual usando AIC como criterio para cada subgrupo por separado. Uso lmList {lme4} que da como resultado un modelo para cada subgrupo (id). Pero si uso stepAIC {MASS} para los elementos de la lista, arroja un error. vea abajo

Entonces la pregunta es: ¿Qué error hay en mi procedimiento / sintaxis? Obtengo resultados para modelos individuales pero no para los creados con lmList. ¿LmList () almacena información diferente sobre el modelo que lm ()?
Pero en la ayuda dice: clase "lmList": una lista de objetos de la clase lm con un modelo común.

>lme4.list.lm<-lmList(formula=Scherkraft.N~Gap.um+Standoff.um+Voidflaeche.px |df$id,data = df)
>lme4.list.lm[[1]]
Call: lm(formula = formula, data = data)
Coefficients:
(Intercept)          Gap.um     Standoff.um  Voidflaeche.px  
  62.306133       -0.009878        0.026317       -0.015048  

>stepAIC(lme4.list.lm[[1]], direction="backward") 
#stepAIC on first element on the list of linear models
Start:  AIC=295.12
Scherkraft.N ~ Gap.um + Standoff.um + Voidflaeche.px
                 Df Sum of Sq    RSS    AIC
- Standoff.um     1      2.81 7187.3 293.14
- Gap.um          1     29.55 7214.0 293.37
<none>                        7184.4 295.12
- Voidflaeche.px  1    604.38 7788.8 297.97  

Error in terms.formula(formula, data = data) : 
'data' argument is of the wrong type

Obviamente, algo no funciona con la lista. Pero no tengo idea de lo que podría ser. Como intenté hacer lo mismo con el paquete base que crea el mismo modelo (al menos los mismos coeficientes). Los resultados están a continuación:

>lin.model<-lm(Scherkraft.N ~ Gap.um + Standoff.um + Voidflaeche.px,df[which(df$id==1),]) 
# id is in order, so should be the same subgroup as for the first list element in lmList

Coefficients:  
(Intercept)    Gap.um  Standoff.um  Voidflaeche.px  
  62.306133 -0.009878     0.026317       -0.015048  

Bueno, esto es lo que me devuelve usando stepAIC en mi linear.model. Hasta donde yo sé, el criterio de información akaike puede usarse para estimar qué modelo equilibra mejor el ajuste y la generalización dados algunos datos.

>stepAIC(lin.model,direction="backward")
Start:  AIC=295.12
Scherkraft.N ~ Gap.um + Standoff.um + Voidflaeche.px
                 Df Sum of Sq    RSS    AIC
- Standoff.um     1      2.81 7187.3 293.14  
- Gap.um          1     29.55 7214.0 293.37
<none>                        7184.4 295.12
- Voidflaeche.px  1    604.38 7788.8 297.97  

Step:  AIC=293.14
Scherkraft.N ~ Gap.um + Voidflaeche.px
                 Df Sum of Sq    RSS    AIC
- Gap.um          1     28.51 7215.8 291.38
 <none>                        7187.3 293.14
- Voidflaeche.px  1    717.63 7904.9 296.85

Step:  AIC=291.38
Scherkraft.N ~ Voidflaeche.px
                 Df Sum of Sq    RSS    AIC
<none>                        7215.8 291.38
- Voidflaeche.px  1    795.46 8011.2 295.65
Call: lm(formula = Scherkraft.N ~ Voidflaeche.px, data = df[which(df$id == 1), ])

Coefficients:
(Intercept)  Voidflaeche.px  
   71.7183         -0.0151  

Leí de la salida, debería usar el modelo: Scherkraft.N ~ Voidflaeche.px porque este es el AIC mínimo. Bueno, sería bueno si alguien pudiera describir brevemente el resultado. Mi comprensión de la regresión gradual (suponiendo que se elimine hacia atrás) es que todos los regresores están incluidos en el modelo inicial. Entonces se elimina el menos importante. El criterio para decidir es el AIC. y así sucesivamente ... De alguna manera tengo problemas para interpretar bien las tablas. Sería bueno si alguien pudiera confirmar mi interpretación. El "-" (menos) representa el regresor eliminado. En la parte superior está el modelo de "inicio" y en la tabla de la tabla a continuación se calculan las posibles eliminaciones de RSS y AIC. Entonces, la primera fila de la primera tabla dice un modelo Scherkraft.N ~ Gap.um + Standoff.um + Voidflaeche.px - Standoff.um daría como resultado un AIC 293.14. Elija el que no tenga Standoff.um: Scherkraft.N ~ Gap.um + Voidflaeche.px

EDITAR
Reemplacé la lmList {lme4} con dlply () para crear la lista de modelos. Aún así, stepAIC no está haciendo frente a la lista. Arrojaotr error. En realidad, creo que es un problema con el paso de datos que necesita AIC. Me preguntaba cómo calcula el valor AIC para cada paso solo a partir de los datos del modelo. @I tomaría los datos originales para construir los modelos dejando un regresor cada vez. De eso calcularía el AIC y lo compararía. Entonces, ¿cómo funciona stepAIC si no tiene acceso a los datos originales? (No puedo ver un parámetro donde paso los datos originales a stepAIC). Aún así, no tengo idea de por qué funciona con un modelo simple pero no con el modelo envuelto en una lista.

>model.list.all <- dlply(df, .id, function(x) 
  {return(lm(Scherkraft.N~Gap.um+Standoff.um+Voidflaeche.px,data=x)) })
>stepAIC(model.list.all[[1]])
Start:  AIC=295.12
Scherkraft.N ~ Gap.um + Standoff.um + Voidflaeche.px
                 Df Sum of Sq    RSS    AIC
- Standoff.um     1      2.81 7187.3 293.14
- Gap.um          1     29.55 7214.0 293.37
<none>                        7184.4 295.12
- Voidflaeche.px  1    604.38 7788.8 297.97
Error in is.data.frame(data) : object 'x' not found

Respuestas a la pregunta(4)

Su respuesta a la pregunta