You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过单次调用emmeans()指定连续预测变量的唯一组合?

单次调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:34:59