Я очень стараюсь добавить линию регрессии на графике ggplot. Сначала я попробовал аблайн, но мне не удалось заставить его работать. Потом я попробовал это ...
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)
В целом, чтобы обеспечить свою собственную формулу , которую вы должны использовать аргументы xи yкоторые будут соответствовать значениям, предусмотренным в ggplot()- в этом случае xбудет интерпретироваться как x.plotи yв y.plot. Более подробную информацию о методах сглаживания и формуле вы можете найти на странице справки функции, stat_smooth()поскольку это статистика, используемая по умолчанию geom_smooth().
Если вы используете те же значения x и y, которые вы указали в ggplot()вызове, и вам нужно построить линию линейной регрессии, вам не нужно использовать внутреннюю формулу 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))
# 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)
Одна вещь, на которую следует обратить внимание, - это соглашение lm (y ~ x). Я немного повернулся для второго чтения, так как переменная, которую вы «прогнозируете», находится на оси x. Хотя отличный ответ.
Это немного менее эффективно, поскольку по умолчанию n=101вычисляются точки, но гораздо более гибко, поскольку строит кривую прогноза для любой поддерживаемой модели predict, например нелинейной npregиз пакета np.
Примечание. Если вы используете scale_x_continuousили, scale_y_continuousнекоторые значения могут быть обрезаны и, следовательно, geom_smoothмогут работать некорректно. Вместо этого используйте coord_cartesianдля увеличения .
И поэтому вам не нужно беспокоиться об упорядочивании формул или просто добавлении +0имен. data.lm$coefficients[['(Intercept)']]и data.lm$coefficients[['DepDelay']].
Ufos
(Почти) всегда (Intercept)будет отображаться первым. Имена делают код более понятным.
Если вы хотите соответствовать другим типам моделей, например кривой доза-реакция с использованием логистических моделей, вам также потребуется создать больше точек данных с функцией прогнозирования, если вы хотите иметь более плавную линию регрессии:
#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)))
Очевидное решение с использованием
geom_abline
:Где
data.lm
находитсяlm
объект, иdata.lm$coefficients
выглядит примерно так:На практике идентичным является
stat_function
построение линии регрессии как функции от x с использованиемpredict
:Это немного менее эффективно, поскольку по умолчанию
n=101
вычисляются точки, но гораздо более гибко, поскольку строит кривую прогноза для любой поддерживаемой моделиpredict
, например нелинейнойnpreg
из пакета np.Примечание. Если вы используете
scale_x_continuous
или,scale_y_continuous
некоторые значения могут быть обрезаны и, следовательно,geom_smooth
могут работать некорректно. Вместо этого используйтеcoord_cartesian
для увеличения .источник
+0
имен.data.lm$coefficients[['(Intercept)']]
иdata.lm$coefficients[['DepDelay']]
.(Intercept)
будет отображаться первым. Имена делают код более понятным.Я нашел эту функцию в блоге
как только вы загрузите функцию, вы можете просто
вы также можете пойти на
ggplotregression( y ~ x + z + Q, data)
Надеюсь это поможет.
источник
Если вы хотите соответствовать другим типам моделей, например кривой доза-реакция с использованием логистических моделей, вам также потребуется создать больше точек данных с функцией прогнозирования, если вы хотите иметь более плавную линию регрессии:
соответствие: ваше соответствие кривой логистической регрессии
источник