2012-05-03 3 views
3

Извините за такой элементарный вопрос - я должен упустить что-то очевидное.Составьте список объектов lm, сохраните их класс

Я хочу создать список объектов lm, которые я буду использовать в вызове llply для проведения анализа посредничества в этом списке. Но это несущественно - мне просто нужно составить список длины m (где m - множество моделей), и каждый элемент внутри m сам будет содержать n lm объектов.

Таким образом, в этом простом примере

d1 <- data.frame(x1 = runif(100, 0, 1), 
      x2 = runif(100, 0, 1), 
      x3 = runif(100, 0, 1), 
      y1 = runif(100, 0, 1), 
      y2 = runif(100, 0, 1), 
      y3 = runif(100, 0, 1)) 

m1 <- lm(y1 ~ x1 + x2 + x3, data = d1) 
m2 <- lm(x1 ~ x2 + x3, data = d1) 
m3 <- lm(y2 ~ x1 + x2 + x3, data = d1) 
m4 <- lm(x2 ~ x1 + x3, data = d1) 
m5 <- lm(y3 ~ y1 + y2 + x3, data = d1) 
m6 <- lm(x3 ~ x1 + x2, data = d1) 

Я хочу, чтобы список, содержащий 3 элемента, а первый элемент будет содержать m1 и m2, то второй будет содержать m3 и m4 и т.д. Моя первая попытка своего рода но объекты lmm не сохраняют свой класс.

mlist <- list(c(m1,m2), 
       c(m3,m4), 
       c(m5,m6)) 

Он имеет правильную длину (т.е. length(mlist) равен 3), но я думал, что я мог получить доступ самого lm объекта с

class(mlist[1][[1]]) 

, но этот элемент, видимо, список.

Я привожу, как я строю список на первом шаге, или это что-то более фундаментальное в отношении объектов lm?

ответ

7

Нет, вы просто путаетесь с c и индексируете список. Попробуйте это:

mlist <- list(list(m1,m2), 
       list(m3,m4), 
       list(m5,m6)) 
> class(mlist[[1]][[1]]) 
[1] "lm" 

Так c будет конкатенации списков, сглаживая их. В случае объекта lm это означает, что он выравнивает каждый объект lm в списке каждого из компонентов объекта, а затем объединяет все эти списки вместе. c более интуитивно используется для атомных векторов.

Индексация списков часто высылает людей. Следует помнить, что [ всегда будет возвращать под-список, а [[ выбирает элемент.

В моем примере выше это означает, что mlist[1] вернет список длины один. Этот первый элемент по-прежнему является списком. Поэтому вам нужно будет сделать что-то вроде mlist[1][[1]][[1]], чтобы добраться до объекта lm таким образом.

+0

блестящий, спасибо. У меня все еще есть тонна, чтобы узнать о списках и индексации. – tomw