【发布时间】:2018-06-03 07:26:28
【问题描述】:
有没有一种简单的方法可以将虚线从实线回归线的末端延伸到预测值?
以下是我的基本尝试:
x = rnorm(10)
y = 5 + x + rnorm(10,0,0.4)
my_lm <- lm(y~x)
summary(my_lm)
my_intercept <- my_lm$coef[1]
my_slope <- my_lm$coef[2]
my_pred = predict(my_lm,data.frame(x = (max(x)+1)))
ggdf <- data.frame( x = c(x,max(x)+1), y = c(y,my_pred), obs_Or_Pred = c(rep("Obs",10),"Pred") )
ggplot(ggdf, aes(x = x, y = y, group = obs_Or_Pred ) ) +
geom_point( size = 3, aes(colour = obs_Or_Pred) ) +
geom_abline( intercept = my_intercept, slope = my_slope, aes( linetype = obs_Or_Pred ) )
这并没有给出我希望看到的输出。我在 SO 上查看了其他一些答案,但没有看到任何简单的东西。我想出的最好的是:
ggdf2 <- data.frame( x = c(x,max(x),max(x)+12), y = c(y,my_intercept+max(x)*my_slope,my_pred), obs_Or_Pred = c(rep("Obs",8),"Pred","Pred"), show_Data_Point = c(rep(TRUE,8),FALSE,TRUE) )
ggplot(ggdf2, aes(x = x, y = y, group = obs_Or_Pred ) ) +
geom_point( data = ggdf2[ggdf2[,"show_Data_Point"],] ,size = 3, aes(colour = obs_Or_Pred) ) +
geom_smooth( method = "lm", se=F, aes(colour = obs_Or_Pred, linetype=obs_Or_Pred) )
这给出了正确的输出,但我必须包含一个额外的列来指定我是否要显示数据点。如果我不这样做,我会得到这两个图中的第二个,它在拟合回归线的末端有一个额外的点:
有没有更简单的方法告诉 ggplot 从线性模型中预测出一个点并画一条虚线?
【问题讨论】:
-
你的方法对我来说似乎很简单。
-
不得不提前进行预测,然后必须指定哪些行将显示为点,哪些行显示为线,这感觉很尴尬。预测/次数较少的情况下很好,但如果我想重复做,手动做会很乏味。
-
我的意思是,
ggplot是一个 plotting 包,而不是建模包。它非常适合绘制您提供的数据。geom_smooth对于简单的用例来说是一个很好的便利,但是当你想要非标准的模型/预测时,你不应该感到惊讶,你需要明确地给它你想要绘制的数据。 -
不,您不应该手动执行此操作,您应该编写一个小辅助函数来为您准备所有数据。
-
公平点,格雷戈尔!
标签: r ggplot2 regression linear-regression prediction