r语言 - emtrends中的自定义对比



使用这个示例数据集

dat <- data.frame(sample=c(1,2,3,4,5,6, 7,8,9,10,11,12,13,14), treatment=c(1,2,3,4,5,6, 1,2,3,4,5,6,7,8), condition=factor(c("A","A","A","A","A","A", "B","B","B","B","B","B","B","B")), scores=c(2,4,3,5,6,13, 41,30,30,23,24,24,10,8))
mod <- lm(scores~treatment*condition, data=dat)

我设置了自定义对比,以查看condition Atreatment上的线性增加,以及condition Btreatment变量上的线性减少:

con <- matrix(c(contr.poly(6)[,1],rep(0,8),rep(0,6),contr.poly(8)[,1]*-1), ncol=2)
con
[,1]        [,2]
[1,] -0.5976143  0.00000000
[2,] -0.3585686  0.00000000
[3,] -0.1195229  0.00000000
[4,]  0.1195229  0.00000000
[5,]  0.3585686  0.00000000
[6,]  0.5976143  0.00000000
[7,]  0.0000000  0.54006172
[8,]  0.0000000  0.38575837
[9,]  0.0000000  0.23145502
[10,]  0.0000000  0.07715167
[11,]  0.0000000 -0.07715167
[12,]  0.0000000 -0.23145502
[13,]  0.0000000 -0.38575837
[14,]  0.0000000 -0.54006172

可以用emmeans计算这些对比吗?

我知道我可以做emm <- emtrends(mod, ~ condition, var="treatment"),它适合线性函数,但是如果我想使用我的自定义对比,它们可以合并到emtrends吗?

可以使用

contrast(emm, con)

这是因为emtrends(),像emmeans()一样,返回一个类emmGrid的对象,这是contrast()可以处理的。

顺便说一下,多项式对比可以通过内置函数获得,因此它们不需要自定义设置。你可以这样写
contrast(emm, "poly", max.degree = 3)

附录

哎呀,我忽略了con是一个矩阵的事实。您需要首先将其重新创建为名为list的元素,其中每个元素都是所需的对比度系数。或者用对比系数作为列的data.frame

我现在正在尝试一个完全不同的答案,因为我从一些评论中了解了更多。

在OP中,我们有一个测试数据集dat,我们已经拟合了下面的模型,并获得了估计的趋势

mod <- lm(scores ~ treatment*condition, data = dat)
emt <- emtrends(mod, ~ condition, var = "treatment")   # I renamed it

以下是估计,以及这些估计的直接比较:

> emt
condition treatment.trend    SE df lower.CL upper.CL
A                    1.80 0.805 10  0.00604     3.59
B                   -4.14 0.520 10 -5.30085    -2.98
Confidence level used: 0.95 
> pairs(emt)
contrast estimate    SE df t.ratio p.value
A - B        5.94 0.958 10   6.201  0.0001

来自注释:

假设我希望得到条件a的线性增加和条件B的线性减少的估计(跨处理)…

我相信上述趋势的比较正是如此。坡度差估计为5.94。顺便说一下,您可以在不使用emmeans中的任何内容的情况下获得此估计。包:

> summary(mod) $ coefficients
Estimate Std. Error    t value     Pr(>|t|)
(Intercept)          -0.800000  3.1355565 -0.2551381 8.037871e-01
treatment             1.800000  0.8051366  2.2356456 4.936755e-02
conditionB           43.192857  4.0889261 10.5633745 9.597218e-07
treatment:conditionB -5.942857  0.9583042 -6.2014308 1.012643e-04

注意treatment:condition的估计和测试是完全相同的。

但是继续注释:

…并使系数具有相同的对比度:con <- list(c1=c(control .poly(6)[,1], control .poly(8)[,1]*-1))

首先,这是均值的对比,而不是斜率。其次,我绝对不认为这是你想要的,因为你把治疗1- 6的斜率放在一个刻度上,把治疗7- 14的斜率放在另一个刻度上。

如果你想在一个对比中,在相同的尺度上,使用emmeans(而不是emtrends)来估计两个不同处理值(例如5和6)和两个条件下的平均值,并构建适当的对比:

> EMM <- emmeans(mod, ~ treatment*condition, at = list(treatment = 5:6))
> contrast(EMM, list(con = c(c(-1, 1), -c(-1, 1))))
contrast estimate    SE df t.ratio p.value
con          5.94 0.958 10   6.201  0.0001

这是有效的,因为无论treatment的值如何,模型拟合具有相同斜率的直线,并且斜率等于间隔为1的两个处理的预测差。

最新更新