Как настроить пользовательские кривые для каждого уровня facet_wrap в ggplot2 R?

#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 ? он не определен и не существует в dataframe

3. @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))
 

введите описание изображения здесь