我有一个lme对象,它是根据一些重复测量的营养摄入数据(每个RespondentID有两个24小时的摄入时间)构造的:

Male.lme2 <- lmer(BoxCoxXY ~ -1 + AgeFactor + IntakeDay + (1|RespondentID),
    data = Male.Data,
    weights = SampleWeight)

并且我可以使用RespondentID通过ranef(Male.lme1)成功检索随机效果。我还想通过RespondentID收集固定效果的结果。如下所示,coef(Male.lme1)不能完全满足我的需求。
> summary(Male.lme1)
Linear mixed model fit by REML
Formula: BoxCoxXY ~ AgeFactor + IntakeDay + (1 | RespondentID)
   Data: Male.Data
  AIC   BIC logLik deviance REMLdev
  9994 10039  -4990     9952    9980
Random effects:
 Groups       Name        Variance Std.Dev.
 RespondentID (Intercept) 0.19408  0.44055
 Residual                 0.37491  0.61230
Number of obs: 4498, groups: RespondentID, 2249

Fixed effects:
                    Estimate Std. Error t value
(Intercept)         13.98016    0.03405   410.6
AgeFactor4to8        0.50572    0.04084    12.4
AgeFactor9to13       0.94329    0.04159    22.7
AgeFactor14to18      1.30654    0.04312    30.3
IntakeDayDay2Intake -0.13871    0.01809    -7.7

Correlation of Fixed Effects:
            (Intr) AgFc48 AgF913 AF1418
AgeFactr4t8 -0.775
AgeFctr9t13 -0.761  0.634
AgFctr14t18 -0.734  0.612  0.601
IntkDyDy2In -0.266  0.000  0.000  0.000

我已将拟合结果附加到我的数据中,head(Male.Data)显示
   NutrientID RespondentID Gender Age SampleWeight  IntakeDay IntakeAmt AgeFactor BoxCoxXY  lmefits
2         267       100020      1  12    0.4952835 Day1Intake 12145.852     9to13 15.61196 15.22633
7         267       100419      1  14    0.3632839 Day1Intake  9591.953    14to18 15.01444 15.31373
8         267       100459      1  11    0.4952835 Day1Intake  7838.713     9to13 14.51458 15.00062
12        267       101138      1  15    1.3258785 Day1Intake 11113.266    14to18 15.38541 15.75337
14        267       101214      1   6    2.1198688 Day1Intake  7150.133      4to8 14.29022 14.32658
18        267       101389      1   5    2.1198688 Day1Intake  5091.528      4to8 13.47928 14.58117
coef(Male.lme1)的前几行是:
$RespondentID
       (Intercept) AgeFactor4to8 AgeFactor9to13 AgeFactor14to18 IntakeDayDay2Intake
100020    14.28304     0.5057221      0.9432941        1.306542          -0.1387098
100419    14.00719     0.5057221      0.9432941        1.306542          -0.1387098
100459    14.05732     0.5057221      0.9432941        1.306542          -0.1387098
101138    14.44682     0.5057221      0.9432941        1.306542          -0.1387098
101214    13.82086     0.5057221      0.9432941        1.306542          -0.1387098
101389    14.07545     0.5057221      0.9432941        1.306542          -0.1387098

为了演示coef结果如何与Male.Data中的拟合估算值相关联(该数据是使用Male.Data$lmefits <- fitted(Male.lme1)捕获的,其年龄因子为9-13的第一个RespondentID:
-拟合值是15.22633,它等于-从系数中-(Intercept) + (AgeFactor9-13) = 14.28304 + 0.9432941
是否有我可以自动使用的聪明命令,即提取每个主题的固定效果估算值,或者我面临一系列if语句,试图将正确的AgeFactor级别应用于每个主题减去Intercept的随机效应贡献后,得到正确的固定效应估计?

抱歉,Update试图减少我提供的输出,却忘记了str()。输出为:
>str(Male.Data)
'data.frame':   4498 obs. of  11 variables:
 $ NutrientID  : int  267 267 267 267 267 267 267 267 267 267 ...
 $ RespondentID: Factor w/ 2249 levels "100020","100419",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Gender      : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Age         : int  12 14 11 15 6 5 10 2 2 9 ...
 $ BodyWeight  : num  51.6 46.3 46.1 63.2 28.4 18 38.2 14.4 14.6 32.1 ...
 $ SampleWeight: num  0.495 0.363 0.495 1.326 2.12 ...
 $ IntakeDay   : Factor w/ 2 levels "Day1Intake","Day2Intake": 1 1 1 1 1 1 1 1 1 1 ...
 $ IntakeAmt   : num  12146 9592 7839 11113 7150 ...
 $ AgeFactor   : Factor w/ 4 levels "1to3","4to8",..: 3 4 3 4 2 2 3 1 1 3 ...
 $ BoxCoxXY    : num  15.6 15 14.5 15.4 14.3 ...
 $ lmefits     : num  15.2 15.3 15 15.8 14.3 ...

不使用BodyWeight和Gender(这是男性数据,因此所有Gender值都相同),并且对于数据来说NutrientID同样固定。

自发布以来,我一直在做可怕的ifelse声明,因此将立即尝试您的建议。 :)

Update2:这与​​我当前的数据完美配合,并且对新数据应具有前瞻性,这要感谢DWin在注释中的额外帮助。 :)
AgeLevels <- length(unique(Male.Data$AgeFactor))
Temp <- as.data.frame(fixef(Male.lme1)['(Intercept)'] +
c(0,fixef(Male.lme1)[2:AgeLevels])[
      match(Male.Data$AgeFactor, c("1to3", "4to8", "9to13","14to18",  "19to30","31to50","51to70","71Plus") )] +
c(0,fixef(Male.lme1)[(AgeLevels+1)])[
      match(Male.Data$IntakeDay, c("Day1Intake","Day2Intake") )])
names(Temp) <- c("FxdEffct")

最佳答案

将会是这样(尽管您确实应该给我们str(Male.Data)的结果,因为模型输出不会告诉我们基线值的因子水平:)

#First look at the coefficients
fixef(Male.lme2)

#Then do the calculations
fixef(Male.lme2)[`(Intercept)`] +
c(0,fixef(Male.lme2)[2:4])[
          match(Male.Data$AgeFactor, c("1to3", "4to8", "9to13","14to18") )] +
c(0,fixef(Male.lme2)[5])[
          match(Male.Data$IntakeDay, c("Day1Intake","Day2Intake") )]

您基本上是通过match函数运行原始数据,以选择正确的系数以添加到截距中……如果数据是该因素的基本水平(我猜测的是其拼写),则该系数将为0。

编辑:我刚刚注意到,您在公式中放置了“-1”,因此也许所有的AgeFactor术语都列在输出中,并且您可以在系数向量中找到0,而在匹配表向量中找到所发明的AgeFactor级别。

关于r - 如何通过观察提取lmer固定效应?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8682865/

10-13 08:03