#r #function #ggplot2 #curve-fitting
#r #функция #ggplot2 #подгонка кривой
Вопрос:
У меня есть диаграмма рассеяния с x = xaxis и y = yaxis и двумя уровнями, которые мне нужно разделить и проанализировать данные отдельно. Для каждого набора данных мне нужно построить пользовательскую функцию формы y ~ (A*((B*x/C)-1) - 1)*log(x))
. Для каждого из уровней мне нужно указать A, B и C. Как мне это сделать в ggplot2?
Пример кода ggplot2. Я сгенерировал случайные данные, поэтому функция сглаживания может не иметь смысла для этих данных (но имеет смысл для моих исходных данных).
xaxis = c(1:100)
yaxis = rnorm(100,2,0.1)
level = rep(c("A","B"), 50)
df <- data.frame(xaxis, yaxis, level)
ggplot(df,aes(x= xaxis, y = yaxis, col = level)) geom_point() facet_wrap(.~level, scales="free") geom_smooth(method="lm", formula = y ~ (A*((B*x/C)-1) - 1)*log(x))
Комментарии:
1. Целью
ggplot
является визуализация. Он обладает некоторой функциональностью для стандартных моделей, но когда моделирование становится сложным, обычно проще выполнять моделирование отдельно от визуализации. Я бы посоветовал подгонять ваши модели с помощьюnls
(или любой другой функции, которую вы предпочитаете), а затем отображать результаты, вместо того, чтобы прилагать много усилий для одновременного выполнения обоих..2. Что
level
? он не определен и не существует в dataframe3. @GregorThomas Я все время повторяю одно и то же, хотя в этом случае было бы довольно легко забежать
nls
внутрьgeom_smooth
. Большая проблема здесь заключается в том, что я не думаю, что эта модель, как указано, когда-либо сойдется. Он содержит A B и C, которые на самом деле просто формируют соотношение. Их индивидуальные значения не поддаются разрешению с помощью регрессии.4. @Mouad_Seridi Ой, я добавил это сейчас
5. @Biotechgeek вы просто хотите нарисовать линии
y ~ (A*((B*x/C)-1) - 1)*log(x)
, где вы указываете A, B и C, или вы хотите найти A, B и C?
Ответ №1:
Если вы пытаетесь подогнать модель, чтобы найти значения A, B и C, используя вашу формулу, вы не можете по той простой причине, что B и C отображаются только как отношение в вашей формуле. Итак, если истинное значение «B» равно 4, а истинное значение «C» равно 2, то это будет неотличимо, скажем, от «B» из 12 и «C» из 6. Только соотношение двух может быть оценено с помощью регрессии.
Если вы просто хотите построить линии, указанные вашей формулой, где вы предварительно указываете A, B и C, то это возможно. Например:
my_func <- function(x, A, B, C) (A*((B*x/C)-1) - 1)*log(x)
ggplot(df,aes(x= xaxis, y = yaxis, col = level))
geom_point()
facet_wrap(.~level, scales = "free")
geom_function(data = data.frame(xaxis = 0, yaxis = 0, level = "A"),
fun = my_func,
args = list(A = 0.05, B = 2, C = 5))
geom_function(data = data.frame(xaxis = 0, yaxis = 0, level = "B"),
fun = my_func,
args = list(A = 0.1, B = -0.0005, C = 1))