使用这个示例数据集
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 A
在treatment
上的线性增加,以及condition B
在treatment
变量上的线性减少:
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的两个处理的预测差。