Отображение уравнения модели nls с ggpmisc
R
пакет ggpmisc
может быть использован, чтобы показать уравнение lm
модель и poly
модель на ggplot2
( Смотрите здесь для справки). Интересно, как показать nls
результаты модельного уравнения на ggplot2
с помощью ggmisc
, Ниже мой MWE.
library(ggpmisc)
args <- list(formula = y ~ k * e ^ x,
start = list(k = 1, e = 2))
ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
stat_fit_augment(method = "nls",
method.args = args)
3 ответа
Вдохновленный постом, который вы связали. использование geom_text
добавить метку после извлечения параметров.
nlsFit <-
nls(formula = mpg ~ k * e ^ wt,
start = list(k = 1, e = 2),
data = mtcars)
nlsParams <-
nlsFit$m$getAllPars()
nlsEqn <-
substitute(italic(y) == k %.% e ^ italic(x),
list(k = format(nlsParams['k'], digits = 4),
e = format(nlsParams['e'], digits = 2)))
nlsTxt <-
as.character(as.expression(nlsEqn))
ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
stat_fit_augment(method = "nls",
method.args = args) +
geom_text(x = 5, y = 30, label = nlsTxt, parse = TRUE)
Также можно добавить уравнение, используя пакет 'ggpmisc', собрав строку символов для анализа с помощьюpaste()
или . В этом ответе я буду использовать . Я отвечаю на вопрос, используя пример, который он включил. Я не показываю это в этом ответе, но этот подход поддерживает группировку и аспекты. Недостатком является то, что модель подгоняется дважды: один раз для построения подогнанной линии и один раз для добавления уравнения.
Чтобы найти имена переменных, возвращаемыхstat_fit_tidy()
Я использовал из пакета 'gginnards', хотя имена, даже если они зависят от формулы и метода модели, довольно легко предсказать. Вместо добавления слоя графикаgeom_debug()
эхоdata
ввод в консоль R. Затем, когда мы знаем имена переменных, которые мы хотим использовать в метке, мы можем собрать строку для анализа как выражение R.
При сборке этикетки сsprintf()
нужно убежать от%
символы, которые должны быть возвращены без изменений, как%%
, поэтому знак умножения%*%
становится%%*%%
. Возможно, и в этом случае полезно вставлять строки символов в выражение R, но нам нужно экранировать встроенные кавычки, как\"
.
library(tidyverse)
library(ggpmisc)
#> Loading required package: ggpp
#>
#> Attaching package: 'ggpp'
#> The following object is masked from 'package:ggplot2':
#>
#> annotate
library(gginnards)
args <- list(formula = y ~ k * e ^ x,
start = list(k = 1, e = 2))
# we find the names of computed values
ggplot(mtcars, aes(wt, mpg)) +
stat_fit_tidy(method = "nls",
method.args = args,
geom = "debug")
#> Input 'data' to 'draw_panel()':
#> npcx npcy k_estimate e_estimate k_se e_se k_stat e_stat
#> 1 NA NA 49.65969 0.7455911 3.788755 0.01985924 13.10713 37.54378
#> k_p.value e_p.value x y fm.class fm.method fm.formula
#> 1 5.963165e-14 8.861929e-27 1.70855 32.725 nls nls y ~ k * e^x
#> fm.formula.chr PANEL group
#> 1 y ~ k * e^x 1 -1
# plot with formula
ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
stat_fit_augment(method = "nls",
method.args = args) +
stat_fit_tidy(method = "nls",
method.args = args,
label.x = "right",
label.y = "top",
aes(label = sprintf("\"mpg\"~`=`~%.3g %%*%% %.3g^{\"wt\"}",
after_stat(k_estimate),
after_stat(e_estimate))),
parse = TRUE )
Создано 2 сентября 2022 г. с использованием репрекса версии 2.0.2.
Здесь я показал nls с группами, использующими ggpmisc для добавления к графикам, используя текущий CRAN ggpmisc (v 0.3.8). Это вариация/модификация виньетки, где 'stat_fit_tidy()' использовала подгонку michaelis-menten, найденную здесь . Вывод выглядит следующим образом:
library(tidyverse)
library(tidymodels)
library(ggpmisc)
my_exp_formula <- y ~ a * exp(b*x-0)
# if x has large values (i.e. >700), subtract the minimum
# see https://stackoverflow.com/a/41108403/4927395
#example with nls, shows the data returned
o <- nls(1/rate ~ a * exp(b*conc-0), data = Puromycin, start = list(a = 1, b = 2))
o
tidy(o)
ggplot(Puromycin, aes(conc, 1/rate, colour = state)) +
geom_point() +
geom_smooth(method = "nls",
formula = my_exp_formula,
se = FALSE) +
stat_fit_tidy(method = "nls",
method.args = list(formula = my_exp_formula),
label.x = "right",
label.y = "top",
aes(label = paste("a~`=`~", signif(stat(a_estimate), digits = 3),
"%+-%", signif(stat(a_se), digits = 2),
"~~~~b~`=`~", signif(stat(b_estimate), digits = 3),
"%+-%", signif(stat(b_se), digits = 2),
sep = "")),
parse = TRUE)
ggsave("exp plot.png")