2011-06-15 8 views
8

¿Existe una función que pueda extraer dos o más columnas de un objeto coeftest? Esto es fácil un objeto coeftest a la vez, pero ¿puedo hacer lo mismo en una lista (que no sea un bucle for())?Extraer columnas de la lista de objetos coeftest

> # meaningless data 
> temp <- data.frame(a = rnorm(100, mean = 5), b = rnorm(100, mean = 1), 
+     c = 1:100) 
> formulas <- list(a ~ b, a ~ c) 
> models <- lapply(formulas, lm, data = temp) 
> library(lmtest) 
> cts <- lapply(models, coeftest) 

> # easy to extract columns one object at a time 
> cts[[1]][, 1:2] 
       Estimate Std. Error 
(Intercept) 5.0314196 0.1333705 
b   -0.1039264 0.0987044 

> # but more difficult algorithmically 
> # either one column 
> lapply(cts, "[[", 1) 
[[1]] 
[1] 5.03142 

[[2]] 
[1] 5.312007 

> # or two 
> lapply(cts, "[[", 1:2) 
Error in FUN(X[[1L]], ...) : attempt to select more than one element 

Tal vez la pregunta más fundamental es que si hay una manera de convertir la carne del objeto coeftest en una trama de datos, lo que me permitiría extraer columnas por separado, y luego utilizo mapply(). ¡Gracias!

Editar: Me gustaría terminar con una matrices (o marcos de datos) con la primera y segunda columna.

[[1]] 
       Estimate Std. Error 
(Intercept) 5.0314196 0.1333705 
b   -0.1039264 0.0987044 

[[2]] 
       Estimate Std. Error 
(Intercept) 5.312007153 0.199485363 
c   -0.007378529 0.003429477 
+1

Probablemente sea más fácil responder si proporciona un resultado deseado. – kohske

+0

@kohske - Buena llamada. Gracias. –

Respuesta

12

[[ es la función subconjunto mal en este caso. Tenga en cuenta que cuando lapply() en una lista, lo que está operando son los componentes de la lista, los bits que obtendría con list[[i]] donde i es el componente i-ésimo.

Como tal, solo necesita el [, 1:2] bit de cts[[1]][, 1:2] en la llamada lapply(). Es un poco más complicado debido a poco los argumentos a favor [, pero fácilmente factible con lapply():

> lapply(cts, `[`, , 1:2) 
[[1]] 
       Estimate Std. Error 
(Intercept) 4.926679544 0.1549482 
b   -0.001967657 0.1062437 

[[2]] 
       Estimate Std. Error 
(Intercept) 4.849041327 0.204342067 
c   0.001494454 0.003512972 

Nota del <space>, antes 1:2; esto es el equivalente de [ , 1:2].

+0

Gracias! Explicación muy clara. –

5

no estoy seguro si esto es lo que quiere, pero ¿qué tal:

> do.call("rbind", cts)[, 1:2] 
       Estimate Std. Error 
(Intercept) 4.8200993881 0.142381642 
b   -0.0421189130 0.092620363 
(Intercept) 4.7459340076 0.206372906 
c   0.0005770324 0.003547885 
+0

@Kohkse - ¡Gracias! Respuesta correcta a una pregunta diferente (tardé en proporcionar el resultado deseado), pero esta es una buena herramienta para más adelante. –

Cuestiones relacionadas