Недавно я начал изучать R и столкнулся с проблемой использования пользовательской функции при построении графика. Я хочу использовать уравнение канифоли-раммлера, но не могу понять, как его использовать в моем случае. В Mathkad это было легко решено. А вот не могу понять.
Это пример моих данных и кода.
ggplot(allOnw, aes(x = xy, y=yy, col = sem1)) +geom_point()+
guides(fill = FALSE) + labs(col = "S" )+theme(legend.position = "bottom") +scale_x_continuous(breaks = seq(from = 0, to = 160, by = 10), limits = c(0,160))+
scale_color_manual(values = c("blue", "cyan", "darkgreen","darkorange","gold","darkorchid")) +
facet_wrap(vars(cat1),ncol = 1, strip.position = "right")+labs(x = "MP")+labs(y = "GT ")
Я бы хотел, чтобы график выглядел так, как при использовании geom_density. Что я могу сделать для этого? Является ли это возможным?
Что касается «пользовательской функции для сглаживания», ?geom_smooth
включает method: Smoothing method (function) to use
, я предлагаю вам изучить это.
Из википедии звучит так, будто «дистрибутив канифоли-раммлера» — это приложение дистрибутива Вейбулла. Вы ищете наиболее подходящее распределение Вейбулла для ваших данных? stats.stackexchange.com/questions/346249/…
Если у вас есть конкретная модель, подходящая для ваших очков, вы можете использовать method = nls
внутри geom_smooth
.
Насколько я могу судить из литературы, функция, которую вы пытаетесь подобрать, принимает следующий вид:
rosin_rammler <- function(x, A, B, C) {
C * ((A / x) * (x / B)^A * exp(-((x / B)^(A - 1))))
}
И мы можем использовать это прямо внутри geom_smooth
:
ggplot(allOnw, aes(x = xy + 1e-6, y = yy, col = sem1)) +
geom_point() +
geom_smooth(formula = y ~ rosin_rammler(x, A, B, C), method = nls,
method.args = list(algorithm = "port",
start = list(A = 5, B = 20, C = 1000),
lower = c(1, 1)), se = FALSE, n = 1000) +
labs(col = "S", x = "MP", y = "GT")+
theme(legend.position = "bottom") +
scale_x_continuous(breaks = 0:16 * 10, limits = c(0, 160)) +
scale_color_manual(values = c("blue", "cyan", "darkgreen",
"darkorange", "gold", "darkorchid")) +
facet_wrap(vars(cat1), ncol = 1, strip.position = "right")
Спасибо. Это очень поможет. Это очень похоже на то, что я хотел. Хочу уточнить несколько моментов. Почему вы добавляете «+1e-6»? Может ли строка с «method.args» получить кривую с максимальным коэффициентом детерминации? Это предполагаемые коэффициенты в строке, где указаны коэффициенты со значениями (начало=список)?
@GurskiyI Я добавляю крошечное значение (1e-6), потому что x = 0 вызовет ошибку деления на ноль. Коэффициенты в start
— это просто разумные отправные точки для параметров. Фактические параметры находятся с помощью nls
метода наименьших квадратов, чтобы получить оптимальные параметры для соответствия данным с использованием этой модели.
Я не очень хорошо знаком с rosin-rammler, но неглубокий поиск, который я сделал до сих пор (например, поиск в Google для
"cran" "rosin" "rammler"
, важные кавычки), показывает, что пакетsievetest
поддерживает функции для дистрибутива, но я не думаю, что какой-либо из он находится в сглаживающей роли. На самом деле я нигде не могу найти сглаживание через этот дистрибутив, в том числе и в MathCad. Можете ли вы указать какую-либо документацию, показывающую, как она используется на любом языке программирования?