Интересно, как добавить уравнение линии регрессии и R ^ 2 на ggplot
. Мой код:
library(ggplot2)
df <- data.frame(x = c(1:100))
df$y <- 2 + 3 * df$x + rnorm(100, sd = 40)
p <- ggplot(data = df, aes(x = x, y = y)) +
geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
geom_point()
p
Любая помощь будет высоко оценена.
r
ggplot2
linear-regression
r-faq
MYaseen208
источник
источник
latticeExtra::lmlineq()
.Ответы:
Вот одно решение
РЕДАКТИРОВАТЬ. Я выяснил источник, откуда я выбрал этот код. Вот ссылка на оригинальный пост в ggplot2 гугл группах
источник
annotate
был верным на моей машине.aes(
и соответствующие)
.aes
предназначен для отображения переменных dataframe в визуальные переменные - здесь это не нужно, поскольку есть только один экземпляр, так что вы можете поместить все это в основнойgeom_text
вызов. Я отредактирую это в ответ.Я включил статистику
stat_poly_eq()
в свой пакет,ggpmisc
который позволяет этот ответ:Эта статистика работает с любым полиномом без пропущенных терминов и, надеюсь, обладает достаточной гибкостью, чтобы быть в целом полезной. Метки R ^ 2 или скорректированные метки R ^ 2 можно использовать с любой формулой модели, снабженной функцией lm (). Будучи статистикой ggplot, она ведет себя как ожидалось как с группами, так и с аспектами.
Пакет ggpmisc доступен через CRAN.
Версия 0.2.6 была только что принята в CRAN.
В нем рассматриваются комментарии @shabbychef и @ MYaseen208.
@ MYaseen208 это показывает, как добавить шляпу .
@shabbychef Теперь можно сопоставить переменные в уравнении с теми, которые используются для меток оси. Чтобы заменить x на скажем z, а y на h, можно использовать:
Будучи этими нормальными R разобранными выражениями, греческие буквы теперь также могут использоваться как в левых, так и в правых частях уравнения.
[2017-03-08] @elarry Отредактируйте, чтобы более точно ответить на исходный вопрос, показывая, как добавить запятую между метками уравнения и R2.
[2019-10-20] @ helen.h Я привожу ниже примеры использования
stat_poly_eq()
с группировкой.[2020-01-21] @Herman На первый взгляд, это может показаться немного нелогичным, но для получения единого уравнения при использовании группировки необходимо следовать грамматике графики. Либо ограничьте сопоставление, которое создает группировку, отдельными слоями (показано ниже), либо оставьте сопоставление по умолчанию и переопределите его постоянным значением в слое, где вы не хотите группировать (например,
colour = "black"
).Продолжая из предыдущего примера.
[2020-01-22] Для полноты примера с гранями, демонстрирующего, что и в этом случае ожидания грамматики графики удовлетворяются.
источник
x
иy
в формуле обратитесь кx
иy
данным в слоях сюжета, и не обязательно к тем , в области видимости в моментmy.formula
строится. Таким образом, формула всегда должна использовать переменные x и y?x
иy
относится к любым переменным, сопоставленным с этой эстетикой. Это ожидание также для geom_smooth () и того, как работает грамматика графики. Было бы яснее использовать разные имена внутри фрейма данных, но я просто сохранил их, как в первоначальном вопросе.ggpmisc
. Спасибо за предложение!aes(label = paste(..eq.label.., ..rr.label.., sep = "*plain(\",\")~"))
делает свою работу.stat_poly_eq()
., Отсутствует предопределенная r.label . Вы также можете использоватьstat_fit_glance()
пакет ggpmisc, который возвращает R2 в виде числового значения. Смотрите примеры на странице справки и заменяйтеstat(r.squared)
наsqrt(stat(r.squared))
.Я изменил несколько строк источника
stat_smooth
и связанных функций, чтобы создать новую функцию, которая добавляет уравнение соответствия и значение R в квадрате. Это будет работать и на фасетных участках!Я использовал код в ответе @ Ramnath для форматирования уравнения.
stat_smooth_func
Функция не очень надежна, но это не должно быть трудно играть с ним.https://gist.github.com/kdauria/524eade46135f6348140 . Попробуйте обновить,
ggplot2
если вы получили ошибку.источник
stat_smooth_func(mapping=aes(group=cut(x.val,c(-70,-20,0,20,50,130))),geom="text",method="lm",hjust=0,parse=TRUE)
, в сочетании с EvaluateSmooths из stackoverflow.com/questions/19735149/…source
весь файл в вашем скрипте.xpos
иypos
аргументы функции в Gist. Поэтому, если вы хотите, чтобы все уравнения перекрывались, просто установитеxpos
иypos
. В противном случаеxpos
иypos
рассчитываются по данным. Если вы хотите что-то более изощренное, не должно быть слишком сложно добавить немного логики в функцию. Например, может быть, вы могли бы написать функцию, чтобы определить, какая часть графика имеет наибольшее пустое пространство, и поместить эту функцию туда.Я изменил пост Рамната: а) сделать более общим, чтобы он принимал линейную модель в качестве параметра, а не фрейм данных, и б) отображал негативы более подходящим образом.
Использование изменится на:
источник
p1 = p + annotate("text", x = 25, y = 300, label = lm_eqn(lm(y ~ x, df)), colour="black", size = 5, parse=TRUE)
edit: это также решает любые проблемы, которые могут возникнуть при отображении писем в вашей легенде."cannot coerce class "lm" to a data.frame"
. Эта альтернатива работает:df.labs <- data.frame(x = 25, y = 300, label = lm_eqn(df))
иp <- p + geom_text(data = df.labs, aes(x = x, y = y, label = label), parse = TRUE)
lm_eqn(lm(...))
. Вы, вероятно, попробовали этот после того, как попробовали тот, но забыли убедиться, что вы переопределилиlm_eqn
действительно люблю решение @Ramnath. Чтобы разрешить использование для настройки формулы регрессии (вместо того, чтобы фиксировать как y и x как литеральные имена переменных), а также добавить p-значение в распечатку (как прокомментировал @Jerry T), вот мод:
К сожалению, это не работает с facet_wrap или facet_grid.
источник
ggplot(mtcars, aes(x = wt, y = mpg, group=cyl))+
до geom_point ()? Наполовину связанный вопрос - если мы ссылаемся на hp и wt вaes()
for ggplot, можем ли мы затем взять их для использования в вызовеlm_eqn
, так что тогда мы должны кодировать только в одном месте? Я знаю, что мы могли бы установитьxvar = "hp"
перед вызовом ggplot () и использовать xvar в обоих местах для замены hp , но такое ощущение, что это не нужно.Использование ggpubr :
источник
label.y
?label.y = max(df$y) * 0.8
Вот самый простой код для всех
Примечание: показывает Ро Пирсона, а не R ^ 2.
источник
Вдохновленный стилем уравнений, представленным в этом ответе , более общий подход (более одного предиктора + вывод латекса в качестве опции) может быть:
model
Аргумент ожидаетlm
объект, тоlatex
аргумент является булевым задать для простого символа или уравнения латекса отформатированных, и...
аргумент передать свои значения вformat
функцию.Я также добавил опцию для вывода в виде латекса, чтобы вы могли использовать эту функцию в rmarkdown следующим образом:
Теперь с его помощью:
Этот код дает:
y = 11.3382963933174 + 2.5893419 * x + 0.1002227 * z
И если мы попросим уравнение латекса, округляем параметры до 3 цифр:
Это дает:
источник
У меня есть сомнение, как поставить значимую статистику t.test для bheta в уравнении, используя
ggpmisc::stat_poly_eq()
?например:
expression(hat(Y)== 0000*"**"+0000*"x"*"*"-0000*"x"^2*"**"~~~~"R"^2*":"~~0.000)
источник