【问题标题】:How can I use lm() with poly() and ggeffect() to plot model effects when variable in quadratic term is not being plotted当未绘制二次项中的变量时,如何将 lm() 与 poly() 和 ggeffect() 一起使用来绘制模型效果
【发布时间】:2020-12-04 19:37:00
【问题描述】:

我正在尝试使用 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 交互的图

这是一个单独的效果图 var_b。我通常不会在没有 var_a 的情况下绘制 var_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'))

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

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

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

【问题讨论】:

    标签: r ggplot2 lm poly


    【解决方案1】:

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

    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 package (v0.3.0) 于 2020 年 12 月 8 日创建

    【讨论】:

    • 谢谢。我明白,但如果我像你一样将它们分开,我将无法再使用 ggeffect(mod2, 'var_a') 创建一个捕获 var_a 二次效应的绘图。还是我错过了什么?实际上,当我尝试使用 ggeffect(mod2, 'var_a') 和您的模型绘制 var_a 的效果时,我实际上收到一条错误消息“度数必须小于唯一点的数量”。
    猜你喜欢
    • 2019-04-09
    • 2018-03-10
    • 2020-07-07
    • 1970-01-01
    • 2021-06-11
    • 2017-09-03
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多