Используйте mapply для подгонки списка моделей lm к списку фреймов данных [R] - PullRequest
2 голосов
/ 03 июня 2011

Возможно ли это? Я могу заставить mapply работать с help примерами, но я не могу заставить работать тривиальный пример с lm. Вот моя попытка, которая возвращает матрицу вместо списка lm объектов.

temp.df <- list(
                data.frame(a = rep(1:10, each = 10), b = 1:100, c = rnorm(100), d = rnorm(100, 2))
                           )
temp.df[[2]] <- subset(temp.df[[1]], a > 2)
temp.mod <- list(a ~ b,
              a ~ b + c,
             a ~ b + c + d)
temp.lm <- mapply(lm, formula = temp.mod, data = temp.df[c(1,1,2)])
temp.sum <- lapply(temp.lm, summary)

Должен ли я просто придерживаться lapply и указывать data = каждый раз? Спасибо!

1 Ответ

3 голосов
/ 03 июня 2011

Не уверен, что вы имеете в виду, указывая данные каждый раз, но если вы упакуете все в больший (вложенный) список и напишите свою собственную функцию-обертку, которая вызывает lm () и summary (), хорошим вариантом будет lapply:

bigList <-  list(m1=list(dat=temp.df[[1]],mod=temp.mod[[1]]),
              m1=list(dat=temp.df[[2]],mod=temp.mod[[2]]))

fitLM <- function(x){
lm1 <- lm(x$mod,data=x$dat)
return(summary(lm1))
}


temp.lm <- lapply(bigList,FUN=fitLM)

Редактировать: просто чтобы проконтролировать поведение mapply, когда я запускаю ваш код, я получаю матрицу 12x3, которая на самом деле содержит всю соответствующую информацию об объекте lm, но атрибут class был утерян. Я полагаю, что сброс этого, а затем неудовлетворительное резюме () работает с вашим исходным кодом. Но я думаю, что вложенный список аргументов и lapply () в этом случае проще.

lmList <- list(a=temp.lm[,1],b=temp.lm[,2],c=temp.lm[,3])
lmList <- lapply(lmList,function(x){class(x) <- "lm";return(x)})
temp.sum <- lapply(lmList, summary)
...