在ggplot上添加回归线

时间:2013-03-26 09:40:06

标签: r ggplot2 regression linear-regression

我正努力在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)

但它也没有用。

5 个答案:

答案 0 :(得分:126)

一般情况下,要提供自己的公式,您应该使用与x中提供的值对应的参数yggplot() - 在这种情况下x将是x.plot解释为yy.plotstat_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))

Multiple LR

# 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)

Single LR

答案 2 :(得分:5)

使用geom_abline的明显解决方案:

geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])

其中data.lmlm对象,而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_continuousscale_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)

希望这会有所帮助。