Quiero hacer de regresión paso a paso el uso de AIC en una lista de modelos lineales. la idea es utilizar el correo una lista de modelos lineales y, a continuación, aplicar stepAIC en cada elemento de la lista. Se produce un error.

Hola chicos he intentado localizar el problema.
Creo que he encontrado el problema. Sin embargo, no entiendo la causa.
Pruebe el código para ver la diferencia entre los 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 a partir de los datos.marco «dat». Que es lo que estaba pensando antes. (Espero que no me equivoco en eso)
Pero no hay ningún parámetro en stepAIC() donde puedo pasar a la estructura de datos original. Obviamente, para los modelos liso no envuelto en una lista es suficiente para pasar la modelo. (las tres últimas líneas de código) Así que me estoy preguntando:

P1: ¿Cómo stepAIC sabe donde encontrar los datos originales «dat» (no sólo el modelo de datos que se pasa como parámetro)?

Q2: ¿Cómo puedo saber que no es otro parámetro en stepAIC() que no está explícitamente indicado en las páginas de ayuda? (tal vez mi inglés es muy malo para encontrar)

P3: ¿Cómo puedo pasar el parámetro para stepAIC()?

Debe estar en algún lugar en el medio ambiente de la aplicar la función y la transmisión de los datos. Ya sea lm() o stepAIC() y el puntero/el enlace de los datos en bruto debe perderse en algún lugar. No tengo una buena comprensión de lo que un entorno en el R ¿. Para mí fue una especie de aislamiento de los locales de las variables globales. Pero tal vez el más complicado. Cualquier persona que puede explicar que a mí en relación con el problema anterior? Honestamente, yo no leo mucho de la R documentación. Cualquier comprender mejor me ayudaría. Gracias.

EDAD:
Tengo los datos en un dataframe df que se puede dividir en varios subgrupos. Para ese propósito he creado un groupID llamado df$id. lm() devuelve el coefficent como se esperaba para el primer subgrupo. Yo quiero hacer una regresión paso a paso el uso de AIC como criterio para cada subgrupo por separado. Yo uso lmList {lme4} que se traduce en un modelo para cada subgrupo (id). Pero si yo uso stepAIC{MASA} para los elementos de la lista se produce un error. ver a continuación.

Así que la pregunta es: ¿Qué error está en mi procedimiento o de la sintaxis? Obtengo los resultados para los modelos sencillos, pero no los creados con la lmList. ¿LmList() almacenar información diferente sobre el modelo de lm () ¿?

Pero en la ayuda que los estados:
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

Algo que obviamente no funciona con la lista. Pero no tengo una idea de lo que podría ser.
Ya traté de hacer lo mismo con el paquete de base que crea el mismo modelo (al menos los mismos coeficientes). Los resultados son los siguientes:

>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 sale devuelve mediante stepAIC en mi lineales.modelo .
Que yo sepa el criterio de información akaike puede ser utilizada para estimar el modelo que mejor equilibra entre el ajuste y la generalización dado 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  

Que he leído de la salida que debo utilizar el modelo: Scherkraft.N ~ Voidflaeche.px debido a que este es el mínimo de la AIC. Bien, sería bueno que si alguien puede describen brevemente la salida. Mi comprensión de la regresión paso a paso (suponiendo hacia atrás eliminación) es todos los regresores incluidos en el modelo inicial. A continuación, la menos importante es eliminado. El criterio para decidir es la AIC. y así sucesivamente… de alguna manera tengo problemas para obtener las tablas interpretado a la derecha. Sería bueno que si alguien puede confirmar mi interpretación. El «-«(menos) representa el eliminado regresor. En la parte superior es el «inicio» de la modelo y en la tabla de la mesa por debajo de la RSS y AIC son calculados para una posible eliminación. Así que la primera fila de la primera tabla que se dice un modelo Scherkraft.N~Brecha.um+punto muerto.um+Voidflaeche.px – punto muerto.um resultaría en un AIC 293.14. Elija el uno sin el punto muerto.um: Scherkraft.N~Brecha.um+Voidflaeche.px

EDICIÓN:

He sustituido el lmList{lme4} con dlply() para crear la lista de modelos.
Todavía stepAIC no es de afrontamiento con la lista. Lanza otro de error. En realidad, creo que es un problema con los datos stepAIC necesita para funcionar a través de. Me preguntaba cómo se calcula el AIC-valor para cada paso sólo a partir de los datos del modelo. Me tomaría el original de los datos para construir los modelos de salir de una variable cada vez. De la misma me gustaría calcular la AIC y comparar. Entonces, ¿cómo stepAIC es trabajo si no tiene acceso a los datos originales. (No puedo ver un parámetro donde paso los datos originales para stepAIC). Aún así, no tengo ni idea de por qué funciona con un simple modelo, 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
  • Probablemente no es la razón, pero df también es una función, así que es mejor darle a su dataframe un nombre diferente.
  • AIC es un trade-off entre explicar la desviación y el sobreajuste del modelo – la adición de parámetros o el aumento de la desviación incurre en una pena
  • Yo no soy capaz de reproducir el error en el (actual) primera sección. Qué resultado obtienes? Y qué versión de R está en ejecución?
  • Su whila atrás. Pero yo puedo ver a un error después de >stepAIC(dat.lin.modelo.lst[[1]]) Se inicia con la AIC procedimiento pero se queja con: Error en la hereda(x, «de los datos.marco») : el objeto ‘d’ no se encuentra. He utilizado para que 2.13. Pero tienes razón no tengo ningún problema en 2.14.2
  • Aehm esperar. Yo creo que depende de los datos que suministro. vuelva a ejecutar el código y el error desapareció. Así que supongo que depende de th se genera de forma aleatoria de números. Todavía extraño mensaje de error que se queja de que no encuentra el objeto.
  • Y estoy aún más confuso, porque la ejecución de la aplicación de la función después de que el error no hay problemas en el procesamiento de los mismos datos.??? ¿Cómo que?

InformationsquelleAutor Sebastian | 2012-02-06

2 Comentarios

  1. 4

    No estoy seguro de lo que puede haber cambiado en el control de versiones para realizar la depuración de tan difícil, pero una solución sería el uso de do.call, que evalúa las expresiones de la llamada antes de ejecutarlo. Esto significa que en lugar de almacenar sólo d en la convocatoria, por lo que update y stepAIC necesidad de ir a buscar d con el fin de hacer su trabajo, almacena una representación completa de la trama de datos en sí.

    Que es, ¿

    do.call("lm", list(y~x1+x2+x3, data=d))

    lugar de

    lm(y~x1+x2+x3, data=d)

    Usted puede ver lo que está tratando de hacer mirando el call elemento del modelo, tal vez como este:

    dat.lin.model.lst <- lapply(split(dat, dat$id), function(d)
                                do.call("lm", list(y~x1+x2+x3, data=d)) )
    dat.lin.model.lst[[1]]$call

    También es posible hacer la lista de tramas de datos en el entorno global y, a continuación, la construcción de la llamada, de modo que update y stepAIC look para cada marco de datos en turno, porque su entorno cadenas de siempre llevar de vuelta para el medio ambiente mundial; como esta:

    dats <- split(dat, dat$id)
    dat.lin.model.list <- lapply(seq_along(dats), function(d)
                do.call("lm", list(y~x1+x2+x3, data=call("[[", quote(dats),i))) )

    Para ver lo que ha cambiado, ejecutar dat.lin.model.lst[[1]]$call de nuevo.

    • También ver este una pregunta relacionada con la.
    • Creo que el problema que yo tenía no era de R-depende de la versión más bien que depende de la los datos proporcionados. Podría intentar establecer.de la semilla(semilla); x1<-rnorm(n, mean=0, sd=1); set.de la semilla(semilla+1); x2<-rnorm(n, media=1, sd=1); set.de la semilla(semilla+2); x3<-rnorm(n, media=2, sd=1); set.de la semilla(semilla+3); epsilon<-rnorm(n,mean=0,sd=1) con semilla<-100 y con semilla<-99. Sin EMBARGO, independientemente de los datos suministrados por el hacer.llame parece funcionar. Eso me hace pensar que algo no está bien.
    • OK, tengo la idea de que con los datos. Voy a empezar con un modelo completo y hacer reducción gradual. En caso de que ninguna de las primeras alternativas de reducción resulta en un mejor AIC el procedimiento se detiene y me sale el modelo completo como un resultado. En caso de que puedo mejorar mi modelo con una reducción de la stepAIC procedimiento debe utilizar los datos iniciales=d que no se encuentra en el espacio de búsqueda. Así se tira un error sólo si hay paso de reducción, que es dependiente de los datos. ESTO es realmente difícil, porque los datos de la muestra podría ejecutar liso, pero en datos reales, se puede salir del procedimiento. Utilizar una vez más hacer.llame al()
    • No seguí todo eso, pero suena razonable y suena como que usted está considerando las cuestiones importantes. Definitivamente es realmente complicado. Cosas como update y stepAIC son muy difíciles de incluir en funciones.
  2. 3

    Como parece que stepAIC sale del bucle de medio ambiente (que es en el medio ambiente mundial) para buscar los datos que necesita, me truco es usar la función de asignación:

        results <- do.call(rbind, lapply(response, function (i) { 
        assign("i", response, envir = .GlobalEnv)
                mdl <- gls(as.formula(paste0(i,"~",paste(expvar, collapse = "+")), data= parevt, correlation = corARMA(p=1,q=1,form= ~as.integer(Year)), weights= varIdent(~1/Linf_var), method="ML")
                mdl <- stepAIC(mdl, direction ="backward")
    }))
    • Gracias, esta fue la razón de mi error. He cambiado la asignación de la variable no se encuentra a <<- lugar, de modo que sería disponibles en el ámbito global.

Dejar respuesta

Please enter your comment!
Please enter your name here