我正努力在ggplot上添加回归线。我首先尝试使用abline,但我没有设法让它工作。然后我试了这个......
data = data.frame(x.plot=rep(seq(1,5),10),y.plot=rnorm(50))
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
geom_smooth(method='lm',formula=data$y.plot~data$x.plot)
但它也没有用。
答案 0 :(得分:126)
一般情况下,要提供自己的公式,您应该使用与x
中提供的值对应的参数y
和ggplot()
- 在这种情况下x
将是x.plot
解释为y
和y.plot
为stat_smooth()
。有关平滑方法和公式的更多信息,您可以在函数geom_smooth()
的帮助页面中找到,因为它是ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
geom_smooth(method='lm',formula=y~x)
使用的默认统计信息。
ggplot()
如果您使用的是geom_smooth()
调用中提供的相同x和y值,并且需要绘制线性回归线,那么您不需要在method="lm"
内使用公式,只需提供ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
geom_smooth(method='lm')
。
{{1}}
答案 1 :(得分:30)
正如我刚想的那样,如果您有一个模型适合多元线性回归,上述解决方案将无法正常工作。
您必须手动创建一行数据框,其中包含原始数据框的预测值(在您的情况下为data
)。
看起来像这样:
# read dataset
df = mtcars
# create multiple linear model
lm_fit <- lm(mpg ~ cyl + hp, data=df)
summary(lm_fit)
# save predictions of the model in the new data frame
# together with variable you want to plot against
predicted_df <- data.frame(mpg_pred = predict(lm_fit, df), hp=df$hp)
# this is the predicted line of multiple linear regression
ggplot(data = df, aes(x = mpg, y = hp)) +
geom_point(color='blue') +
geom_line(color='red',data = predicted_df, aes(x=mpg_pred, y=hp))
# this is predicted line comparing only chosen variables
ggplot(data = df, aes(x = mpg, y = hp)) +
geom_point(color='blue') +
geom_smooth(method = "lm", se = FALSE)
答案 2 :(得分:5)
使用geom_abline
的明显解决方案:
geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])
其中data.lm
是lm
对象,而data.lm$coefficients
看起来像这样:
data.lm$coefficients
(Intercept) DepDelay
-2.006045 1.025109
实际上,stat_function
使用predict
使用stat_function(fun = function(x) predict(data.lm, newdata = data.frame(DepDelay=x)))
来绘制回归线作为x的函数:
n=101
效率较低,因为默认情况下会计算predict
个点,但灵活性更高,因为它将为支持npreg
的任何模型(例如非线性{{ 1}}来自软件包np。
注意:如果使用scale_x_continuous
或scale_y_continuous
,则某些值可能会被截断,因此geom_smooth
可能无法正常工作。 Use coord_cartesian
to zoom instead。
答案 3 :(得分:2)
如果您想要使用其他类型的模型,例如使用逻辑模型的剂量 - 反应曲线,您还需要使用函数预测创建更多数据点,如果您想要更平滑的回归线:
适合:你符合逻辑回归曲线
Thing
答案 4 :(得分:1)
我在blog
上发现了此功能 ggplotRegression <- function (fit) {
`require(ggplot2)
ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) +
geom_point() +
stat_smooth(method = "lm", col = "red") +
labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
"Intercept =",signif(fit$coef[[1]],5 ),
" Slope =",signif(fit$coef[[2]], 5),
" P =",signif(summary(fit)$coef[2,4], 5)))
}`
一旦加载了可以简单地完成的功能
ggplotRegression(fit)
您也可以申请ggplotregression( y ~ x + z + Q, data)
希望这会有所帮助。