我在 R 中使用 emmeans() 来估计用单结拟合线性模型后的边际均值。我知道我们可以使用
at = list(x = c())
明确预测器应设置为什么值。我需要通过为结定义一个新变量来创建模型,这使得创建这个 at =
更加复杂。
可重现的示例:
#
library(dplyr)
library(emmeans)
set.seed(080723)
# Simulate data
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()
# Plot the simulated data
plot(df$x, df$y, pch = 16, col = "blue", xlab = "x", ylab = "y")
# Manually add a covariate to act as a spline in regression
df <- df%>%mutate(xk_15 = case_when(
x <= 15 ~ 0,
x > 15 ~ x-15
))
# LM using that covariate
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 时 y 的估计边际平均值。但是,考虑到我的模型公式,我还需要指定 xk_15。为了匹配所需的 x 值,xk_15 的值应分别为 0、0、0、5。
我可以通过运行 emmeans() 两次来完成此任务。
首先,
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 =
向量的元素。请注意,该代码不起作用。
我介绍当前的样条设置,因为它是我的驱动力,但我可以想象这可以推广到使用 emmeans() 的任何两个连续预测变量。当然,我可以获得所需的估计边际均值,如图所示,调用 emmeans() 两次,但是如果能够在一行中指定连续预测变量的特定组合,尤其是在有许多感兴趣的组合的情况下,那就太好了。
grid_data <- data.frame(x=c(5, 10, 15, 20), xk_15=c(0, 0, 0, 5))
emm <- emmeans(m1, specs = "x", grid = grid_data)
print(emm)
这样,您将能够在一次调用中完成。