如何防止 R 使用混合模型将回归线外推到数据点范围之外?

How can I prevent R from extrapolating the regression line outside the range of data points using a mixed model?

提问人:JaGo 提问时间:9/30/2023 最后编辑:JaGo 更新时间:10/1/2023 访问量:56

问:

我在 R 中拟合了一个混合模型,其交互项如下:. 和 是连续变量,是分类变量,是随机效应。model <- lmer(y ~ x * z + (1|h), data = df)yxzh

数据:

 n <- 50
df <- tibble::tibble(
  x = rnorm(n),
  z = sample(-1:1, n, replace = TRUE),
  h = sample(1:3, n, replace=TRUE), # random effect
  y = z*(0.5*x) + rnorm(n,0,0.2))
df$z <- as.factor(df$z)
df$h <- as.factor(df$h)

然后,我使用包中的函数,然后使用 from 分别可视化不同类别的每个回归,如下所示:plot_predictions()marginaleffectsfacet_wrap(~ z)ggplot2

plot_predictions(model, condition = c("x","z"), vcov = T, points= 0.3) + facet_wrap(~ z)

如您所见,第一个和第二个图根据第三个图的数据点限制将回归线外推到其数据范围之外。

因此,我尝试通过添加以下内容来控制这一点:newdata = df

plot_predictions(model, new data = df, by = c("x","z"), vcov = T, points= 0.3) + facet_wrap(~ z)

但是,现在我有一个新问题;我失去了线性效果,它看起来像一条破坏性的非连续线。有趣的是,它只发生在我拟合具有随机效应的混合模型(即 glmm、hgam)时,但对于简单的线性模型来说并非如此。

在这里看图

知道如何防止这种情况发生,将我的回归线 (+- CI) 限制在每个面板的数据点范围内并保持线性模型线吗?

R ggplot2 预测 混合模型 边际效应

评论

0赞 Nova 9/30/2023
嘿 JaGo,如果你发布其余的代码(例如,而不是说“那我正在使用......”,而是实际发布你的其余代码,你会得到更多的帮助。也包括库。plot_predictions

答:

0赞 Vincent 9/30/2023 #1

下面的代码似乎使用最新版本的 按预期工作。marginaleffects

(PS:下次,如果你写了一个完整的可复制的例子,里面有库和一个我们可以剪切和粘贴的连续代码块,那对那些试图给出答案的人来说会很方便。

library(lme4)
library(ggplot2)
library(marginaleffects)
n <- 50
df <- tibble::tibble(
  x = rnorm(n),
  z = sample(-1:1, n, replace = TRUE),
  h = sample(1:3, n, replace=TRUE), # random effect
  y = z*(0.5*x) + rnorm(n,0,0.2))
df$z <- as.factor(df$z)
df$h <- as.factor(df$h)
model <- lmer(y ~ x * z + (1|h), data = df)

plot_predictions(model, newdata = df, by = c("x","z"), vcov = TRUE, points= 0.3) +
    facet_wrap(~ z, scales = "free")

评论

0赞 JaGo 10/1/2023
嗨,@Vincent,感谢您的回答和您的惊人包裹。我已经用最新版本更新了软件包,但是,我的问题仍然是“我失去了线性效果,而是显示了一条破坏性的非连续线”。我使用相同的代码,但它不起作用。现在你可以在我的原始帖子中看到这张图片。不知道为什么会这样。marginaleffects0.15.1
0赞 Vincent 10/1/2023
是的,这有时会发生在使用 而不是 .这是正常的和“正确的”,因为计算的数量是不同的(参见网站上的绘图小插图)。遗憾的是,没有办法使用参数自动约束各个方面中的轴。最简单的解决方案是设置 ,这将返回一个数据帧。然后,您可以根据需要对数据框进行子集化,并用于绘制结果。byconditionconditiondraw=FALSEggplot2