Как извлечь случайные эффекты для определенной группы из объекта R lme? - PullRequest
2 голосов
/ 10 сентября 2010

Я успешно установил линейную модель смешанных эффектов и собираюсь выделить компонент случайных эффектов для отдельных групп.Я знаю, что полный список случайных эффектов можно извлечь с помощью

random.effects(model)

. Затем print (random.effects (модель)) дает список из двух столбцов имен групп и случайных эффектов, даже если сами данныекажется, имеет только один столбец.Мой вопрос заключается в том, можно ли «искать» случайный эффект, связанный с конкретной группой, по имени группы, или, если нет, как мне найти список имен групп в том же порядке, что и случайные эффекты в данныхкадр, который выводится функцией random.effects ().

Спасибо
Марк Ch.

Ответы [ 3 ]

1 голос
/ 10 сентября 2010

Это то, что вы ищете?

> library(nlme)    
> fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc),
            data = Loblolly,
            fixed = Asym + R0 + lrc ~ 1,
            random = Asym ~ 1,
            start = c(Asym = 103, R0 = -8.5, lrc = -3.3))

> str(random.effects(fm1))
Classes ‘ranef.lme’ and 'data.frame':   14 obs. of  1 variable:
 $ Asym: num  -5.57 -5.02 -1.69 -2.36 -2.98 ...
 - attr(*, "effectNames")= chr "Asym"
 - attr(*, "label")= chr "Random effects"
 - attr(*, "level")= int 1
 - attr(*, "standardized")= logi FALSE
 - attr(*, "grpNames")= chr "Seed"
> random.effects(fm1)$Asym
 [1] -5.5654676 -5.0168202 -1.6920794 -2.3587798 -2.9814647 -1.4018554
 [7] -0.1100587 -2.3613150  1.1947892  2.0119121  2.9862349  3.5890462
[13]  4.6094776  7.0963810
1 голос
/ 11 сентября 2010

Проблема, как оказалось, заключалась в моем особом способе индексации групп.ranef (lme) возвращает фрейм данных, где имена строк являются именами групп.В моих данных я использовал очень длинное число, чтобы различать группы, которые R округлились до нескольких десятичных разрядов.Это означало, что невозможно точно указать отдельные группы по имени.

Я решил проблему путем преобразования каждого индекса в число base-62.Я использовал цифры и строчные и прописные буквы в качестве набора символов в числе.(То есть совпадающее число [a-zA-Z0-9] *) Это значительно уменьшило длину имени группы и лишило возможности R округлять имя группы - чем больше символов вы используете, тем короче становится.

Теперь, если я это сделаю:

M3.ranef <- ranef(M3)
x <- M3.ranef[group_ID,1]

x - это случайный эффект для группы с именем group_ID, как и должны работать фреймы данных.

0 голосов
/ 10 сентября 2010
> library(nlme)
> d <- data.frame(x=rep(letters, each=5),
                z=rep(LETTERS[1:13], each=10),
                y=rep(rnorm(26, sd=2), each=5) + rep(rnorm(13), each=10) + rnorm(26 * 5))
> r <- ranef(d)   # random.effects is a synonym for this
# Look at the structure of r
> str(r)
List of 2
 $ z:'data.frame':  13 obs. of  1 variable:
  ..$ (Intercept): num [1:13] -1.575 -0.365 -1.817 0.235 2.369 ...
  ..- attr(*, "effectNames")= chr "(Intercept)"
 $ x:'data.frame':  26 obs. of  1 variable:
  ..$ (Intercept): num [1:26] -0.8628 0.0536 1.724 -1.9115 -1.1764 ...
  ..- attr(*, "effectNames")= chr "(Intercept)"
 - attr(*, "label")= chr "Random effects"
 - attr(*, "level")= int 2
 - attr(*, "standardized")= logi FALSE
 - attr(*, "grpNames")= chr [1:2] "z" "x %in% z"
 - attr(*, "class")= chr [1:2] "ranef.lme" "list"
> head(r$x)
    (Intercept)
A/a -0.86283867
A/b  0.05360748
B/c  1.72401850
B/d -1.91145501
C/e -1.17643222
C/f  0.24315559
> head(r$z)
  (Intercept)
A  -1.5752441
B  -0.3648627
C  -1.8167101
D   0.2353324
E   2.3685118
F  -1.7544619
> r$z["A", ]
[1] -1.575244
> r$x["A/a", ]
[1] -0.8628387
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...