【发布时间】: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 = Days、y = x1 和z = pred2 制作一个曲面图,并按group 分层。我没有使用线框命令开始的表面图经验:
wireframe(pred2 ~ Days * x1, data = new.df[new.df$group==1,],
xlab = "Days", ylab = "x1", zlab="Predicted fit"
)
然而,虽然这个命令没有给出错误,我的情节是空白的:
问题:
- 我的线框哪里出了问题?
- 有没有更好的方法来可视化我的模型拟合?
【问题讨论】:
-
我使用来自
plotly::plot_ly的(无)得到相同的结果。 -
你没有表面。那就是问题所在。您的数据在 x,y,z 处有单点。查看数据
volcano以找出可以表示为表面的内容。充其量你可以有一条 3d 线。 -
那么,你建议我如何可视化这些回归系数?
-
首先我建议
X1与预测无关。其次,通过查看rgl::plot3d(mydf$Days, mydf$x1, mydf$pred2),您可能会获得一些关于可视化的想法。 p.s.mydf <- 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))您可能会发现这也很有帮助。