Добавление линии регрессии на ggplot



Я очень стараюсь добавить линию регрессии на 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)


но это не работает.

630   4  

4 ответов:

в общем, чтобы предоставить свою собственную формулу, вы должны использовать аргументы x и y это будет соответствовать значениям, которые вы предоставили в ggplot() - в данном случае x будет интерпретироваться как x.plot и y как y.plot. Более подробную информацию о методах сглаживания и формуле вы можете найти на странице справки function 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)

если вы используете те же значения x и y, которые вы указали в ggplot() звоните и надо постройте линию линейной регрессии, тогда вам не нужно использовать формулу внутри geom_smooth(), просто поставить method="lm".

ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) + 
  geom_smooth(method='lm')

как я понял, в случае, если у вас есть модель установлена на множественной линейной регрессии, указанное решение не будет работать.

вы должны создать свою линию вручную как фрейм данных, который содержит прогнозируемые значения для вашего исходного фрейма данных (в вашем случае 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

Если вы хотите соответствовать другим типам моделей, например кривой доза-ответ с использованием логистических моделей, вам также нужно будет создать больше точек данных с функцией predict, если вы хотите иметь более плавную линию регрессии:

fit: ваша подгонка кривой логистической регрессии

#Create a range of doses:
mm <- data.frame(DOSE = seq(0, max(data$DOSE), length.out = 100))
#Create a new data frame for ggplot using predict and your range of new 
#doses:
fit.ggplot=data.frame(y=predict(fit, newdata=mm),x=mm$DOSE)

ggplot(data=data,aes(x=log10(DOSE),y=log(viability)))+geom_point()+
geom_line(data=fit.ggplot,aes(x=log10(x),y=log(y)))

Я нашел эту функцию на блог

 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)

надеюсь, что это помогает.

Comments

    Ничего не найдено.