【问题标题】:How to display different levels in a multilevel analysis with different colors如何在多级分析中用不同的颜色显示不同的级别
【发布时间】:2017-04-29 20:25:12
【问题描述】:

我是多级分析的初学者,并尝试了解如何使用base-R 的绘图函数绘制图表。我了解下面fit 的输出,但我正在为可视化而苦苦挣扎。 df只是一些简单的测试数据:

t <- seq(0, 10, 1)
df <- data.frame(t = t,
                 y = 1.5+0.5*(-1)^t + (1.5+0.5*(-1)^t) * t,
                 p1 = as.factor(rep(c("p1", "p2"), 10)[1:11]))

fit <- lm(y ~ t * p1, data = df)

# I am looking for an automated version of that:
plot(df$t, df$y)
lines(df$t[df$p1 == "p1"], 
      fit$coefficients[1] + fit$coefficients[2] * df$t[df$p1 == "p1"], col = "blue")
lines(df$t[df$p1 == "p2"], 
      fit$coefficients[1] + fit$coefficients[2] * df$t[df$p1 == "p2"] + 
        + fit$coefficients[3] + fit$coefficients[4] * df$t[df$p1 == "p2"], col = "red")

它应该知道它必须包含p1 并且有两行。
结果应如下所示:

编辑:Predict est &lt;- predict(fit, newx = t) 给出与 fit 相同的结果,但我仍然不知道“如何聚类”。

编辑 2 @Keith:公式 y ~ t * p1 读取为 y = (a + c * p1) + (b + d * p1) * t。对于“第一条蓝线”c, d 都是零。

【问题讨论】:

  • ty 总是一样吗?你会一直有一个单因素列吗?
  • 获得拟合值的更好方法是通过predict()。以newdata 的形式传递一个data.frame,以供预测和惊讶。
  • @KeithHughitt 不,我真正的问题会复杂得多,请看here 的简化示例。这个问题的主要目的实际上是“如何获得具有正确线数的图形”。即使在这种简单的情况下(p1 只有 2 个级别!)我失败了;-)
  • @RomanLuštrik 查看我的编辑。我知道predict(虽然我不明白为什么它比lm 好),但这里的问题是如何获得“正确的行数”。另请参阅上面的评论。这可能是一个愚蠢的问题,但我想不通。
  • 什么是“集群”?没有像newx 这样的论点。我不明白这里的行数有什么问题?行数应该与p1 中的因子级别一样多,对吗?

标签: r plot lm


【解决方案1】:

我会这样做。我还包括了ggplot2 版本的情节,因为我发现它更适合我思考情节的方式。 此版本将考虑p1 中的级别数。如果您想补偿模型参数的数量,您只需调整构造 xy 的方式以包含所有相关变量。我应该指出,如果您省略 newdata 参数,则会对提供给 lm 的数据集进行拟合。

t <- seq(0, 10, 1)
df <- data.frame(t = t,
                 y = 1.5+0.5*(-1)^t + (1.5+0.5*(-1)^t) * t,
                 p1 = as.factor(rep(c("p1", "p2"), 10)[1:11]))

fit <- lm(y ~ t * p1, data = df)

xy <- data.frame(t = t, p1 = rep(levels(df$p1), each = length(t)))
xy$fitted <- predict(fit, newdata = xy)

library(RColorBrewer) # for colors, you can define your own
cols <- brewer.pal(n = length(levels(df$p1)), name = "Set1") # feel free to ignore the warning

plot(x = df$t, y = df$y)
for (i in 1:length(levels(xy$p1))) {
  tmp <- xy[xy$p1 == levels(xy$p1)[i], ]
  lines(x = tmp$t, y = tmp$fitted, col = cols[i])
}

library(ggplot2)
ggplot(xy, aes(x = t, y = fitted, color = p1)) +
  theme_bw() +
  geom_point(data = df, aes(x = t, y = y)) +
  geom_line()

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 2012-01-25
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多