2011-04-08 18 views
10

¿Hay una estructura de datos R en la que puedo almacenar un número de objetos lm o lmer o gam? J tiene matrices en caja, y uno puede poner casi cualquier cosa en las celdas de una matriz en caja. Creo que eso es lo que estoy buscando en R.¿Cómo almaceno "arrays" de modelos estadísticos?

He intentado listas y marcos de datos, inútilmente; Pensé que las listas podrían funcionar.

> testlist <- list() 
> testlist[1] <- subject1.2008.gam 
Warning message: 
In testlist[1] <- subject1.2008.gam : 
    number of items to replace is not a multiple of replacement length 
> 

Por otra parte, hay una manera de crear y utilizar un nombre de variable en la LHS de <-?

Finalmente, tal vez usted tiene una mejor expresión idiomática para mí. Estoy tratando de crear una colección de modelos de GAM sobre un conjunto de temas y años, por ejemplo. Más tarde, quiero poder trazar o predecir a partir de esos modelos, así que creo que necesito mantener todo el modelo. Como deseo poder utilizar este código con diferentes conjuntos de datos más adelante, me gustaría no codificar los nombres de los objetos gam ni su número.

Mientras comenzaba poniendo la llamada gam() en un bucle, creo que una de las funciones apply() podría funcionar mejor, pero aún necesito un lugar para almacenar la salida.

+0

Es posible que también desee examinar plyr, que hace que este tipo de ajuste de modelo v Muy fácil. – hadley

Respuesta

17

Se necesita el operador [[ para las listas, intente

testlist[[1]] <- subject1.2008.gam 

La otra punta habitual es que es posible que desee asignar previamente si sabe cuántos elementos que pueda tener, lo hago a menudo

testlist <- vector(mode="list", length=N) 

para un N dado.

+0

Ambas respuestas son esencialmente iguales y parecen resolver mi problema; ¡Gracias! – Bill

+0

También puede usar una cadena para el índice de la lista; esto es mucho más útil y legible más adelante. p.ej. 'models [[model_name]] <- model'. – metakermit

3

Uso [[ acceder a los elementos de la lista:

library(mgcv) 
set.seed(0) ## simulate some data... 
dat <- gamSim(1,n=400,dist="normal",scale=2) 

mods <- vector(mode = "list", length = 3) 
for(i in seq_along(mods)) { 
    mods[[i]] <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat) 
} 

El dar:

> str(mods, max = 1) 
List of 3 
$ :List of 43 
    ..- attr(*, "class")= chr [1:3] "gam" "glm" "lm" 
$ :List of 43 
    ..- attr(*, "class")= chr [1:3] "gam" "glm" "lm" 
$ :List of 43 
    ..- attr(*, "class")= chr [1:3] "gam" "glm" "lm" 
+1

Parece que te gané por un minuto o dos :) Pero acabo de darte un voto positivo para el buen ejemplo con los modelos 'gam()'. –

+0

@Dirk Descripción completa: Acabo de robar eso del ejemplo de Simon en '? Gam' ;-) –

2

Las otras respuestas muestran cómo utilizar un índice y [[ ]] pero también se puede hacer algo como

x1 <- 1:10 ; y1 <- 30*x1 + rnorm(10) 
x2 <- rnorm(20) ; y2 <- 30*x2 + 100 + rnorm(20) 
lm1 <- lm(y1 ~ x1); lm2 <- lm(y2 ~ x2) 

testlist <- list(A = lm1, Z = lm2) 
testlist$Z 
testlist$Z$model$y2