无法通过 R 中的 emmeans 对比拦截
Failed to contrast intercepts through emmeans in R
我想测试观察者对具有不同极性、正(白)和负(黑)的对比刺激的反应的对称性。我将反应时间 (RT) 作为因变量,以及四种不同的对比。众所周知,响应时间遵循 Pieron 曲线,其渐近线位于 (1) 观察者阈值 (Inf) 和 (2) 位于 250 到 450 毫秒之间的基本 RT 处。
这些知识使我们能够将自变量(有效对比度 EC)转换为 1/EC^2 (tEC) 的关系线性化,因此将 RT 与 EC 联系起来的方程式变为:
RT = m * tEC + RT0
为了测试对称性,我建立了标准:两个极性中相同的斜率和相同的截距意味着对称性。
为了获得系数,我制作了一个具有交互作用的线性模型(通过极性虚拟变量编码:正或负)。 lm 的输出对我来说很清楚,但一些同事更喜欢类似于 ANOVA 输出的东西。所以我决定使用 emmeans 来进行对比。斜率是可以的,但是当计算截距时,问题就开始了。 lm计算的截距和emmeans的输出有很大的不同,得出的结论也不同。下面我重现这个例子。
问题有两个:可以使用 emmeans 来解决我的问题吗?如果没有,是否可以通过其他包(哪个)进行对比?
数据
RT1000
EC
tEC
Polarity
596.3564
-25
0.001600
Negative
648.2471
-20
0.002500
Negative
770.7602
-17
0.003460
Negative
831.2971
-15
0.004444
Negative
1311.3331
15
0.004444
Positive
1173.8942
17
0.003460
Positive
1113.7240
20
0.002500
Positive
869.3635
25
0.001600
Positive
代码
# Model
model <- lm(RT1000 ~ tEC * Polarity, data = Data)
# emmeans
library(emmeans)
# Slopes
m.slopes <- lstrends(model, "Polarity", var="tEC")
# Intercepts
m.intercept <- lsmeans(model, "Polarity")
# Contrasts
pairs(m.slopes)
pairs(m.intercept)
产出
型号
term
estimate
std.error
statistic
p.value
(Intercept)
449.948
66.829
6.733
0.003
tEC
87205.179
20992.976
4.154
0.014
PolarityPositive
230.946
94.511
2.444
0.071
tEC:PolarityPositive
58133.172
29688.551
1.958
0.122
斜坡(没关系)
Polarity
tEC.trend
SE
df
lower.CL
upper.CL
Negative
87205.18
20992.98
4
28919.33
145491.0
Positive
145338.35
20992.98
4
87052.51
203624.2
contrast
estimate
SE
df
t.ratio
p.value
Negative - Positive
-58133.17
29688.55
4
-1.958101
0.12182
拦截(问题)
Polarity
lsmean
SE
df
lower.CL
upper.CL
Negative
711.6652
22.2867
4
649.7874
773.543
Positive
1117.0787
22.2867
4
1055.2009
1178.957
contrast
estimate
SE
df
t.ratio
p.value
Negative - Positive
-405.4135
31.51816
4
-12.86285
0.000211
通过 emmeans 计算的截距与 lm 计算的截距不同。我认为问题是模型没有为 EC = 0 定义。但我不确定。
你所说的拦截不是;它们是 tEC
平均值的模型预测。如果你想要拦截,请改用:
m.intercept <- lsmeans(model, "Polarity", at = list(tEC = 0))
您可以通过
了解正在使用的参考水平
ref_grid(model) # or str(m.intercept)
请注意,此处拟合的模型由两条斜率不同的线组成;因此,预测之间的差异会根据 tEC
的值而变化。因此,我强烈建议 against 测试截距的比较;这些是 tEC
值的预测,正如您所说,甚至不可能发生。取而代之的是,尽量少做数学家,并在 tEC
的几个代表性值上进行比较,例如
LSMs <- lsmeans(model, "Polarity", at = list(tEC = c(0.001, 0.003, 0.005)))
pairs(LSMs, by = tEC)
您还可以轻松地可视化拟合线:
emmip(model, Polarity ~ tEC, cov.reduce = range)
我想测试观察者对具有不同极性、正(白)和负(黑)的对比刺激的反应的对称性。我将反应时间 (RT) 作为因变量,以及四种不同的对比。众所周知,响应时间遵循 Pieron 曲线,其渐近线位于 (1) 观察者阈值 (Inf) 和 (2) 位于 250 到 450 毫秒之间的基本 RT 处。 这些知识使我们能够将自变量(有效对比度 EC)转换为 1/EC^2 (tEC) 的关系线性化,因此将 RT 与 EC 联系起来的方程式变为:
RT = m * tEC + RT0
为了测试对称性,我建立了标准:两个极性中相同的斜率和相同的截距意味着对称性。 为了获得系数,我制作了一个具有交互作用的线性模型(通过极性虚拟变量编码:正或负)。 lm 的输出对我来说很清楚,但一些同事更喜欢类似于 ANOVA 输出的东西。所以我决定使用 emmeans 来进行对比。斜率是可以的,但是当计算截距时,问题就开始了。 lm计算的截距和emmeans的输出有很大的不同,得出的结论也不同。下面我重现这个例子。 问题有两个:可以使用 emmeans 来解决我的问题吗?如果没有,是否可以通过其他包(哪个)进行对比?
数据
RT1000 | EC | tEC | Polarity |
---|---|---|---|
596.3564 | -25 | 0.001600 | Negative |
648.2471 | -20 | 0.002500 | Negative |
770.7602 | -17 | 0.003460 | Negative |
831.2971 | -15 | 0.004444 | Negative |
1311.3331 | 15 | 0.004444 | Positive |
1173.8942 | 17 | 0.003460 | Positive |
1113.7240 | 20 | 0.002500 | Positive |
869.3635 | 25 | 0.001600 | Positive |
代码
# Model
model <- lm(RT1000 ~ tEC * Polarity, data = Data)
# emmeans
library(emmeans)
# Slopes
m.slopes <- lstrends(model, "Polarity", var="tEC")
# Intercepts
m.intercept <- lsmeans(model, "Polarity")
# Contrasts
pairs(m.slopes)
pairs(m.intercept)
产出
型号term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 449.948 | 66.829 | 6.733 | 0.003 |
tEC | 87205.179 | 20992.976 | 4.154 | 0.014 |
PolarityPositive | 230.946 | 94.511 | 2.444 | 0.071 |
tEC:PolarityPositive | 58133.172 | 29688.551 | 1.958 | 0.122 |
Polarity | tEC.trend | SE | df | lower.CL | upper.CL |
---|---|---|---|---|---|
Negative | 87205.18 | 20992.98 | 4 | 28919.33 | 145491.0 |
Positive | 145338.35 | 20992.98 | 4 | 87052.51 | 203624.2 |
contrast | estimate | SE | df | t.ratio | p.value |
---|---|---|---|---|---|
Negative - Positive | -58133.17 | 29688.55 | 4 | -1.958101 | 0.12182 |
Polarity | lsmean | SE | df | lower.CL | upper.CL |
---|---|---|---|---|---|
Negative | 711.6652 | 22.2867 | 4 | 649.7874 | 773.543 |
Positive | 1117.0787 | 22.2867 | 4 | 1055.2009 | 1178.957 |
contrast | estimate | SE | df | t.ratio | p.value |
---|---|---|---|---|---|
Negative - Positive | -405.4135 | 31.51816 | 4 | -12.86285 | 0.000211 |
通过 emmeans 计算的截距与 lm 计算的截距不同。我认为问题是模型没有为 EC = 0 定义。但我不确定。
你所说的拦截不是;它们是 tEC
平均值的模型预测。如果你想要拦截,请改用:
m.intercept <- lsmeans(model, "Polarity", at = list(tEC = 0))
您可以通过
了解正在使用的参考水平ref_grid(model) # or str(m.intercept)
请注意,此处拟合的模型由两条斜率不同的线组成;因此,预测之间的差异会根据 tEC
的值而变化。因此,我强烈建议 against 测试截距的比较;这些是 tEC
值的预测,正如您所说,甚至不可能发生。取而代之的是,尽量少做数学家,并在 tEC
的几个代表性值上进行比较,例如
LSMs <- lsmeans(model, "Polarity", at = list(tEC = c(0.001, 0.003, 0.005)))
pairs(LSMs, by = tEC)
您还可以轻松地可视化拟合线:
emmip(model, Polarity ~ tEC, cov.reduce = range)