繁体   English   中英

如何从 R 中的 package lme4 中提取参数的实际值及其标准误差而不是 lmer 中的边际效应估计值?

[英]How to extract the actual values of parameters and their standard error instead of the marginal effect estimates in lmer from package lme4 in R?

我有这个假数据集,它描述了气温对两种植物(a 和 b)生长的影响。

data1 <- read.csv(text = "
year,block,specie,temperature,growth
2019,1,a,0,7.217496163
2019,1,a,1,2.809792001
2019,1,a,2,16.09505635
2019,1,a,3,24.52673264
2019,1,a,4,49.98455022
2019,1,a,5,35.78568291
2019,2,a,0,8.332533323
2019,2,a,1,16.5997836
2019,2,a,2,11.95833966
2019,2,a,3,34.4
2019,2,a,4,54.19081002
2019,2,a,5,41.1291734
2019,1,b,0,14.07939683
2019,1,b,1,13.73257973
2019,1,b,2,31.33076651
2019,1,b,3,44.81995622
2019,1,b,4,79.27999184
2019,1,b,5,75.0527336
2019,2,b,0,14.18896232
2019,2,b,1,29.00692747
2019,2,b,2,27.83736734
2019,2,b,3,61.46006916
2019,2,b,4,93.91100024
2019,2,b,5,92.47922985
2020,1,a,0,4.117536842
2020,1,a,1,12.70711508
2020,1,a,2,16.09570046
2020,1,a,3,29.49417491
2020,1,a,4,35.94571498
2020,1,a,5,50.74477018
2020,2,a,0,3.490585144
2020,2,a,1,3.817105315
2020,2,a,2,22.43112718
2020,2,a,3,14.4
2020,2,a,4,46.84223604
2020,2,a,5,39.10398717
2020,1,b,0,10.17712428
2020,1,b,1,22.04514586
2020,1,b,2,30.37221799
2020,1,b,3,51.80333619
2020,1,b,4,76.22765452
2020,1,b,5,78.37284714
2020,2,b,0,7.308139613
2020,2,b,1,22.03241605
2020,2,b,2,45.88385871
2020,2,b,3,30.43669633
2020,2,b,4,76.12904988
2020,2,b,5,85.9324324
")

该实验进行了两年,采用块设计(嵌套在几年内)。 目标是告知每单位温度变化会影响多少生长。 此外,需要为此估计提供不确定性(标准误差)的度量。 对于在零温度下记录的生长也需要这样做。

library(lme4)
library(lmerTest)
library(lsmeans)

test.model.1 <- lmer(growth ~ 
                       specie +
                       temperature +
                       specie*temperature +
                       (1|year) +
                       (1|year:block),
                     data= data1,
                     REML=T,
                     control=lmerControl(check.nobs.vs.nlev = "ignore",
                                         check.nobs.vs.rankZ = "ignore",
                                         check.nobs.vs.nRE="ignore")) 
summary(test.model.1)

总结给我这个output的固定效果:

Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: growth ~ specie + temperature + specie * temperature + (1 | year) +  
    (1 | year:block)
   Data: data1
Control: lmerControl(check.nobs.vs.nlev = "ignore", check.nobs.vs.rankZ = "ignore",  
    check.nobs.vs.nRE = "ignore")

REML criterion at convergence: 331.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6408 -0.7637  0.1516  0.5248  2.4809 

Random effects:
 Groups     Name        Variance Std.Dev.
 year:block (Intercept)  6.231   2.496   
 year       (Intercept)  0.000   0.000   
 Residual               74.117   8.609   
Number of obs: 48, groups:  year:block, 4; year, 2

Fixed effects:
                    Estimate Std. Error     df t value Pr(>|t|)    
(Intercept)            2.699      3.356 26.256   0.804    0.428    
specieb                4.433      4.406 41.000   1.006    0.320    
temperature            8.624      1.029 41.000   8.381  2.0e-10 ***
specieb:temperature    7.088      1.455 41.000   4.871  1.7e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) specib tmprtr
specieb     -0.656              
temperature -0.767  0.584       
spcb:tmprtr  0.542 -0.826 -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')

由此我可以得到物种 "a" (2.699)和物种 "b" (2.699 + 4.443 = 7.132)在 0 度温度下的生长。 此外,对于物种“a”,每单位温度变化的生长变化率为(8.624)(8.624 + 7.088 = 15.712) 我遇到的问题是summary()中报告的标准偏差是针对边际估计的,而不是针对参数的实际值的。 例如,4.443(物种)的标准误差是 4.406.. 但这不是物种 b 在 0 度时实际增长的标准误差,即 7.132。 我正在寻找的是比方说 7.132 的标准错误。 另外,如果我手动完成的所有计算都能自动执行,我会很高兴。

我正在尝试使用 lsmeans package 中的lsmeans emmeans()进行一些尝试,但我没有成功。

emmeans(test.model.1, growth ~ specie*temperature) 

错误:

Error in contrast.emmGrid(object = new("emmGrid", model.info = list(call = lmer(formula = growth ~  : 
  Contrast function 'growth.emmc' not found

我认为您的主要问题是您不需要给emmeans公式左侧的响应变量(package 假设您将使用与原始 model 相同的响应变量) - 公式的手边保留用于指定对比。 例如pairwise ~... - 见help("contrast-methods", package = "emmeans")

我想你可能正在寻找:

emmeans(test.model.1, ~specie, at = list(temperature=0))
NOTE: Results may be misleading due to involvement in interactions
 specie emmean   SE   df lower.CL upper.CL
 a        2.70 3.36 11.3   -4.665     10.1
 b        7.13 3.36 11.3   -0.232     14.5

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95

如果您不指定温度值,则emmeans使用(我认为)整体平均温度。

对于斜坡,您需要emtrends

emtrends(test.model.1, ~specie, var = "temperature")
 specie temperature.trend   SE df lower.CL upper.CL
 a                   8.62 1.03 41     6.55     10.7
 b                  15.71 1.03 41    13.63     17.8

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

我强烈推荐emmeans package 的广泛而清晰的小插曲 由于emmeans具有如此多的功能,因此可能需要一些时间才能找到您确切问题的答案,但从长远来看,这种努力将得到回报。

作为一个小小的挑剔点,我想说summary()给你的是R 内部使用的“实际”参数,而emmeans()给你的是边际手段(正如package的名称所暗示的那样 - 预期m arginal 的意思是……)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM