¿Usando algún tipo de función bind() para crear un data.frame con coeficientes de modelos anidados?

Creo que tengo una buena idea, pero no sé cómo implementarla. Actualmente estoy ejecutando una serie de modelos anidados. Por ejemplo:

y<-c(1, 0, 1, 1, 1, 1, 1, 1, 0)
x1<-c(1, 0, 9, 9, 1, 9, 2, 1, 0)
x2<-c(1, 2, 3, 5, 4, 2, 4, 5, 1)
x3<-c(1, 2, 1, 4, 1, 3, 4, 8, 3)

model1 <-lm(y~x1)
model2 <-lm(y~x1+x2)
model3 <-lm(y~x1+x2+x3)

model1_output<-(summary(model1 )$coefficients[1])
model2_output<-(summary(model1 )$coefficients[1])
model3_output<-(summary(model1 )$coefficients[1])

Luego me gustaría poner todo mi resultado en una tabla de datos que coincida con las filas (nombres de variables) pero inserte los nuevos coeficientes en sus propias columnas. Me gustaría que el data.frame presente el resultado de mi ejemplo como:

             b(Model 1)  b(Model 2) b(Model 3)
 (Intercept)  0.59217    0.2555     0.27983
 x1           0.05220    0.04116    0.0375
 x2              NA      0.12530    0.15142
 x3              NA      NA        -0.02994

Estoy seguro de que debe haber alguna forma inteligente de hacer esto usando el paquete plyr() (¡o algún otro paquete!), pero parece que no puedo resolverlo. ¡Gracias!

preguntado el 27 de julio de 12 a las 18:07

Esta respuesta es muy relevante y probablemente más flexible que parte de lo que se ha discutido aquí: stackoverflow.com/questions/16962576/… -

2 Respuestas

Usando esto https://www.youtube.com/watch?v=xB-eutXNUMXJtA&feature=youtu.be de otra pregunta:

cbind.fill<-function(...){
    nm <- list(...) 
    nm<-lapply(nm, as.matrix)
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function (x) 
    rbind(x, matrix(, n-nrow(x), ncol(x))))) 
}

Podrías hacer esto:

do.call(cbind.fill,lapply(list(model1,model2,model3),function(x){coef(x)}))

                  [,1]       [,2]        [,3]
(Intercept) 0.59216966 0.25551154  0.27982881
x1          0.05220228 0.04116431  0.03754457
                    NA 0.12530141  0.15142340
                    NA         NA -0.02993768

Y luego configure los nombres de fila y columna manualmente. (Tenga en cuenta que esto devuelve una matriz, no un marco de datos, si eso le importa).

contestado el 23 de mayo de 17 a las 12:05

Pregunta rápida: ¿cómo agregaría varias columnas relacionadas con mis coeficientes? Lo intenté: do.call(cbind.fill,lapply(list(model1,model2,model3),function(x){coef[1:4](x)})) pero eso no parecía funcionar. - Roody

Pruebe lo siguiente. Traté de mantenerlo lo más general posible y pedí prestada la ayuda de aquí.

models <- list(model1=model1,model2=model2,model3=model3)    

#Find out which model (by index) has the most coefficients.
max.model <- which.max(unlist(lapply(models, function(x) length(x[[1]]))))

#How many coefficients there are in the 'biggest' model (including intercept)
max <- length(models[[max.model]][[1]])

#Create list of coefficients, replacing blank spaces with NA
coeff <- lapply(models, function(x) c(x[[1]],rep(NA,max-length(x[[1]]))))

#See the link above
result <- do.call(cbind,coeff)

colnames(result) <- names(models)

rownames(result) <- names(models[[max.model]][[1]])

Resultado:

> result
                model1     model2      model3
(Intercept) 0.59216966 0.25551154  0.27982881
x1          0.05220228 0.04116431  0.03754457
x2                  NA 0.12530141  0.15142340
x3                  NA         NA -0.02993768

Lo que quiero decir con tratar de mantenerlo general es que esto funcionaría con cualquier número de modelos; solo la primera línea de código necesita cambiar.

contestado el 23 de mayo de 17 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.