能否通过单次调用emmeans()指定连续预测变量的唯一组合?
当使用R语言的emmeans()函数对手动添加节点变量的线性模型计算边际均值时,由于节点变量(如示例中的xk_15)与原预测变量x存在依赖关系,直接用at = list(...)会生成所有组合而非一一对应的取值,导致需要多次调用函数。以下是可复现场景及解决方案:
可复现代码
library(dplyr) library(emmeans) set.seed(080723) # 模拟数据 n <- 1000 df <- data.frame(x = runif(n, 0, 30)) df <- df%>% rowwise()%>% mutate(y = case_when( x <= 15 ~ (2*x) + rnorm(1, 0, 5), x > 15 ~ (2*x) + (5*(x-15)) + rnorm(1, 0, 5) ))%>% ungroup() # 手动添加节点变量 df <- df%>%mutate(xk_15 = case_when( x <= 15 ~ 0, x > 15 ~ x-15 )) # 拟合线性模型 m1 <- lm(y ~ x + xk_15, data = df) summary(m1)
模型输出:
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.53337 0.39976 -1.334 0.182
x 2.01647 0.03994 50.493 <2e-16 ***
xk_15 4.99538 0.07298 68.452 <2e-16 ***
当前的多次调用方式
要获取x=5、10、15、20对应的边际均值(对应xk_15取值为0、0、0、5),目前只能分两次调用:
第一次调用:
emmeans(m1, "x", at = list(x=c(5,10,15), xk_15=c(0)))
输出:
x emmean SE df lower.CL upper.CL
5 9.55 0.248 997 9.06 10.0
10 19.63 0.206 997 19.23 20.0
15 29.71 0.322 997 29.08 30.3
第二次调用:
emmeans(m1, "x", at = list(x=c(20), xk_15=c(5)))
输出:
x emmean SE df lower.CL upper.CL
20 64.8 0.203 997 64.4 65.2
问题
能否通过单次调用实现这一需求?
尝试emmeans(m1, "x" , at = list(x=c(5,10,15,20),xk_15=c(0,0,0,5)))无法正常运行,因为列表参数会生成所有变量组合而非一一对应。
解决方案
可以通过在at参数中传入数据框而非列表来实现一一对应的取值组合,数据框的每一行对应一组x和xk_15的取值:
# 创建包含对应取值的数据框 at_df <- data.frame( x = c(5, 10, 15, 20), xk_15 = c(0, 0, 0, 5) ) # 单次调用emmeans emmeans(m1, "x", at = at_df)
运行结果:
x emmean SE df lower.CL upper.CL
5 9.55 0.248 997 9.06 10.0
10 19.63 0.206 997 19.23 20.0
15 29.71 0.322 997 29.08 30.3
20 64.80 0.203 997 64.40 65.20
这种方式通过单次调用得到了所有目标取值的边际均值,同时保证了x和xk_15的取值一一对应,适用于任意存在依赖关系的连续预测变量场景。
内容的提问来源于stack exchange,提问作者Reid

