首页 > 解决方案 > 当未绘制二次项中的变量时,如何将 lm() 与 poly() 和 ggeffect() 一起使用来绘制模型效果

问题描述

我正在尝试使用 ggeffects 包绘制模型效果。通常这没有问题。但是,我有一个模型,其中二次项和一阶项之间存在交互作用(例如:var_a^2:var_b)。在我的实际模型中,有两个二次项,一个涉及与第三项的交互。下面的示例显示了两个变量的问题,以使示例尽可能简单。

如果我按如下方式使用 poly() 函数,一切正常;该模型工作正常,我可以绘制模型效果。但是,我希望能够从模型中删除他 var_a^2:var_b 交互。

# Create a data frame with explanatory variables
dat <- expand.grid(var_a = c(-1, 0, 1),
                   var_b = c(-1, 0, 1))

# Replicate so there plenty of data points for modelling
dat <- bind_rows(dat, dat)

# Create response value
dat$resp <- dat$var_a + 4 * dat$var_a^2 + dat$var_a * dat$var_b + rnorm(nrow(dat), 0, 0.2)


mod1 <- lm(resp ~ poly(var_a, 2) * var_b, data = dat)
summary(mod1)

plot(ggeffect(mod1, c('var_a', 'var_b')))
plot(ggeffect(mod1, c('var_b')))

这是 var_a:var_b 交互的图 a:b 交互图

这是一个单独的效果图 var_b 。我通常不会在没有 var_a 的情况下绘制 var_b ,因为它们涉及交互,但这只是为了说明我的问题。它在这里有效,但不在下面。 效果 b 图

如上所述,我想删除 var_a^2:var_b 交互。据我所知,为此我需要将一阶和二阶 poly() 项分开,如下所示。

# This is the same as mod 1 without the var_a^2:var_b interaction
# I've split up the poly() terms so I can remove any unwanted terms
mod2 <- lm(resp ~ poly(var_a, 1) * var_b + poly(var_a, 2)[, 2], data = dat)
summary(mod2)

我可以绘制 var_a:var_b 效果并得到与上面基本相同的结果。

plot(ggeffect(mod2, c('var_a', 'var_b')))

但我不能再单独绘制 var_b 效果了。

plot(ggeffect(mod2, 'var_b'))

mod2 b 的输出

对于它的价值,我相信 ggeffect() 函数不起作用,因为它所依赖的效果包将除正在绘制的变量 (var_b) 之外的所有变量设置为不允许 var_a 的二次效应的常量值计算出来的。

有没有办法以允许我从模型中删除不需要的交互同时仍然能够使用 ggeffect() 绘制模型效果的方式使用 poly() 函数?

我试图在这个问题中添加 ggeffects 和 effects 标签,但没有足够的分数来创建新标签。如果有人愿意这样做,请这样做。

标签: rggplot2lmpoly

解决方案


在您的特定示例中,您可以在拟合模型之前创建第二个多变量:

library(ggeffects)

dat <- expand.grid(var_a = c(-1, 0, 1),
                   var_b = c(-1, 0, 1))

# Replicate so there plenty of data points for modelling
dat <- rbind(dat, dat)

# Create response value
dat$resp <- dat$var_a + 4 * dat$var_a^2 + dat$var_a * dat$var_b + rnorm(nrow(dat), 0, 0.2)

dat$var_a_p1 <- poly(dat$var_a, 2)[,2]
mod2 <- lm(resp ~ poly(var_a, 1) * var_b + var_a_p1, data = dat)
plot(ggemmeans(mod2, c('var_b')))
#> Loading required namespace: emmeans
#> NOTE: Results may be misleading due to involvement in interactions
#> Loading required namespace: ggplot2

reprex 包于 2020-12-08 创建(v0.3.0)


推荐阅读