0

我有一个带有 log(x+1) 转换响应变量的混合效应模型。emmeans 类型为“响应”的输出提供了我正在比较的两组的均值和置信区间。但是我想要的是组之间差异的平均值和 CI(即估计值)。emmeans 仅提供比率(使用 type="response")或对数比率(使用 type="link"),我不确定如何将其更改为绝对值。如果您在没有 log(x+1) 转换的情况下运行模型,则 emmeans 会提供估计的差异和围绕该差异的 CI,而不是比率。当我的响应变量转换为 log(x+1) 时,我还能如何做到这一点?

bmnameF.lme2 = lme(log(bm+1)~TorC*name, random=~TorC|site, 
data=matched.cases3F, method='REML')

emmeans(lme, pairwise~TorC, 
type='response')%>%confint(OmeanFHR[[2]])%>%as.data.frame

emmeans.TorC    emmeans.emmean  emmeans.SE  emmeans.df  emmeans.lower.CL    emmeans.upper.CL    contrasts.contrast  contrasts.estimate  contrasts.SE    contrasts.df    contrasts.lower.CL  contrasts.upper.CL 
Managed         376.5484          98.66305     25         219.5120             645.9267            Managed - Open       3.390123          1.068689          217             1.821298         6.310297   
Open            111.0722          43.15374     25         49.8994            247.2381              Managed - Open       3.390123          1.068689          217             1.821298         6.310297
4

1 回答 1

1

让我展示一个不同的示例,以便所有观众都可以重现结果:

mod = lm(log(breaks+1) ~ wool*tension, data = warpbreaks)

如您所见,使用对数转换,比较/对比默认以比率表示。但这可以通过在调用中指定transform而不是更改:typeemmeans()

> emmeans(mod, pairwise ~ tension|wool, transform = "response")
$emmeans
wool = A:
 tension response   SE df lower.CL upper.CL
 L           42.3 5.06 48     32.1     52.4
 M           23.6 2.83 48     17.9     29.3
 H           23.7 2.83 48     18.0     29.4

wool = B:
 tension response   SE df lower.CL upper.CL
 L           27.7 3.32 48     21.0     34.4
 M           28.4 3.40 48     21.6     35.3
 H           19.3 2.31 48     14.6     23.9

Confidence level used: 0.95 

$contrasts
wool = A:
 contrast estimate   SE df t.ratio p.value
 L - M     18.6253 5.80 48  3.213  0.0065 
 L - H     18.5775 5.80 48  3.204  0.0067 
 M - H     -0.0479 4.01 48 -0.012  0.9999 

wool = B:
 contrast estimate   SE df t.ratio p.value
 L - M     -0.7180 4.75 48 -0.151  0.9875 
 L - H      8.4247 4.04 48  2.086  0.1035 
 M - H      9.1426 4.11 48  2.224  0.0772 

P value adjustment: tukey method for comparing a family of 3 estimates

或者,您可以稍后通过以下regrid()函数执行此操作:

emm1 = emmeans(mod, ~ tension | wool)
emm2 = regrid(emm1)
emm2          # estimates
pairs(emm2)   # comparisons

regrid()创建一个新emmGrid对象,其中所有内容都已经进行了反向转换,从而避开了与对数转换结果的对比发生的行为。(在上图中,参数只是在构造参考网格之后transform调用。)regrid

但是还有另一件微妙的事情发生了:转换被自动检测为log; 该+1部分被忽略。因此,反向转换的估计值都太大了 1。要做到这一点,您需要使用make.tran()函数来创建对数转换的这种泛化:

> emm3 = update(emmeans(mod, ~ tension | wool), tran = make.tran("genlog", 1))
> str(emm3)
'emmGrid' object with variables:
    tension = L, M, H
    wool = A, B
Transformation: “log(mu + 1)” 

> regrid(emm3)
wool = A:
 tension response   SE df lower.CL upper.CL
 L           41.3 5.06 48     31.1     51.4
 M           22.6 2.83 48     16.9     28.3
 H           22.7 2.83 48     17.0     28.4

wool = B:
 tension response   SE df lower.CL upper.CL
 L           26.7 3.32 48     20.0     33.4
 M           27.4 3.40 48     20.6     34.3
 H           18.3 2.31 48     13.6     22.9

Confidence level used: 0.95

比较结果与前面显示的相同,因为将所有均值偏移 1 不会影响成对差异。

有关更多详细信息,请参阅vignette("transformations", "emmeans")https://cran.r-project.org/web/packages/emmeans/vignettes/transformations.html

于 2019-09-09T15:07:10.777 回答