【问题标题】:Making surface plot of regression estimates from multiple continuous variables从多个连续变量制作回归估计的曲面图
【发布时间】:2017-06-10 18:38:36
【问题描述】:

我有一个包含分类和连续变量以及样条的多级模型。美好而复杂。无论如何,我正在尝试可视化模型拟合。

例如,这里有一些玩具数据:

library(lme4)
library(rms)
library(gridExtra)

## Make model using sleepstudy data
head(sleepstudy)
# Add some extra vars
sleepstudy$group <- factor( sample(c(1,2), nrow(sleepstudy), replace=TRUE) )
sleepstudy$x1 <- jitter(sleepstudy$Days, factor=5)^2 * jitter(sleepstudy$Reaction)

# Set up a mixed model with spline
fm1 <- lmer(Reaction ~ rcs(Days, 4) * group + (rcs(Days, 4) | Subject), sleepstudy)
# Now add continuous covar
fm2 <- lmer(Reaction ~ rcs(Days, 4) * group + x1 + (rcs(Days, 4) | Subject), sleepstudy)

# Plot fit
new.df <- sleepstudy
new.df$pred1 <- predict(fm1, new.df, allow.new.levels=TRUE, re.form=NA)
new.df$pred2 <- predict(fm2, new.df, allow.new.levels=TRUE, re.form=NA)

g1 <- ggplot(data=new.df, aes(x=Days)) +
    geom_line(aes(y=pred1, col=group), size=2) +
    ggtitle("Model 1")
g2 <- ggplot(data=new.df, aes(x=Days)) +
    geom_line(aes(y=pred2, col=group), size=2) +
    ggtitle("Model 2")

 grid.arrange(g1, g2, nrow=1)

地块 1 是平滑的,但是由于 x1 的影响,地块 2 是锯齿状的。所以我想用x = Daysy = x1z = pred2 制作一个曲面图,并按group 分层。我没有使用线框命令开始的表面图经验:

wireframe(pred2 ~ Days * x1, data = new.df[new.df$group==1,],
      xlab = "Days", ylab = "x1", zlab="Predicted fit"
)

然而,虽然这个命令没有给出错误,我的情节是空白的:

问题:

  1. 我的线框哪里出了问题?
  2. 有没有更好的方法来可视化我的模型拟合?

【问题讨论】:

  • 我使用来自plotly::plot_ly的(无)得到相同的结果。
  • 你没有表面。那就是问题所在。您的数据在 x,y,z 处有单点。查看数据volcano 以找出可以表示为表面的内容。充其量你可以有一条 3d 线。
  • 那么,你建议我如何可视化这些回归系数?
  • 首先我建议X1 与预测无关。其次,通过查看rgl::plot3d(mydf$Days, mydf$x1, mydf$pred2),您可能会获得一些关于可视化的想法。 p.s. mydf &lt;- new.df[new.df$group==1,].
  • 如果我可以看一下真实数据,也许可以为您提供进一步的帮助;但是,Idk 如果您可以发布所有数据。 plotly::plot_ly(data, x = ~Days, y = ~x1, z = ~pred2, type = 'scatter3d', mode = 'lines', opacity = 1 , line = list(width = 6, color = "red", reverscale = FALSE)) 您可能会发现这也很有帮助。

标签: r plot model surface


【解决方案1】:

我发现wireframe' orplot_ly' 表面所需的数据格式是 x 行 x y 列对应 z 值的二维矩阵(我从这个问题 Plotly 3d surface graph has incorrect x and y axis values 中得到了提示)。我还意识到我可以使用 `expand.grid' 来制作一个涵盖可能 x 和 y 值范围的矩阵,并使用它们来预测 z,如下所示:

days <- 0:9
x1_range <- range(sleepstudy$x1)[2] * c(0.05, 0.1, 0.15, 0.2, 0.25, 0.3)

new.data2 <- expand.grid(Days = days, x1 = x1_range, group = unique(sleepstudy$group) )
new.data2$pred <- predict(fm2, new.data2, allow.new.levels=TRUE, re.form=NA)

然后我可以将它们填充到两个不同的矩阵中,以表示模型中每个组的 z 表面:

surf1 <- ( matrix(new.data2[new.data2$group == 1, ]$pred, nrow = length(days), ncol = length(x1_range)) )
surf2 <- ( matrix(new.data2[new.data2$group == 2, ]$pred, nrow = length(days), ncol = length(x1_range)) )
group <- c(rep(1, nrow(surf1)), rep(2, nrow(surf2) ))

最后我可以使用 plot_ly 来绘制每个表面:

plot_ly (z=surf1, x = mets_range, y = ages, type="surface") %>%
    add_surface (z = surf2, surfacecolor=surf2,
             color=c('red','yellow'))

结果图:

所以结果图就是我想要的(虽然在这个虚构的例子中不是很有用,但在真实数据中很有用)。我唯一不知道的是如何显示两种不同的色标。我可以完全取消比例,但如果有人知道如何为不同的表面显示 2 个比例,请告诉我,我会编辑答案。

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2016-10-03
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多