nls fit работает, но не работает внутри geom_smooth - PullRequest
1 голос
/ 09 января 2020

Я хочу использовать ggplot для подгонки функции nls к некоторым данным. Функция nls работает хорошо, когда используется вне geom_smooth (), но внутри не работает.

Код:

library(ggplot2)

df <- structure(list(concentration = c(0, 0.5, 1.5, 4, 12, 35, 100), 
                     response = c(0.015, 0.03673, 0.07212, 0.1027, 0.1286, 0.1858, 0.1812)),
                class = "data.frame", row.names = c(NA, -7L))

df.fit <- nls(response ~ k0 + (ki*concentration/(KI + concentration)), df, start = list(k0 = 0.001, ki = 0.18, KI = 1))
coef(df.fit)

plot <- ggplot(df, aes(concentration, response))+
  geom_point()+
  geom_smooth(method = "nls", se = F, method.args = list(formula = response ~ k0 + (ki*concentration/(KI + concentration)), 
                                                         start = list(k0 = 0.001, ki = 0.18, KI = 1)))
plot

Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 09 января 2020

Вы не можете указать nls вписывается в geom_smooth используя символьный вектор. Из файла справки:

  method: Smoothing method (function) to use, accepts either a
          character vector, e.g. ‘"auto"’, ‘"lm"’, ‘"glm"’, ‘"gam"’,
          ‘"loess"’ or a function, e.g. ‘MASS::rlm’ or ‘mgcv::gam’,
          ‘stats::lm’, or ‘stats::loess’.

Вы можете указать новый вектор прогнозов и построить их с помощью geom_line:

library(ggplot2)

df <- structure(list(concentration = c(0, 0.5, 1.5, 4, 12, 35, 100),
                     response = c(0.015, 0.03673, 0.07212, 0.1027, 0.1286, 0.1858, 0.1812)),
                class = "data.frame", row.names = c(NA, -7L))

df.fit <- nls(response ~ k0 + (ki*concentration/(KI + concentration)), df, start = list(k0 = 0.001, ki = 0.18, KI = 1))
coef(df.fit)
df$pred <- predict(df.fit)

plot <- ggplot(df, aes(concentration, response))+
  geom_point()+
  geom_line(aes(x = concentration, y = pred))
plot
0 голосов
/ 09 января 2020

Извините, я смущен, что задал вопрос сейчас. Мне просто нужно было изменить переменные «response» и «концентрации» внутри формулы geom_smooth на «y» и «x» следующим образом.

library(ggplot2)

df <- structure(list(concentration = c(0, 0.5, 1.5, 4, 12, 35, 100), 
                     response = c(0.015, 0.03673, 0.07212, 0.1027, 0.1286, 0.1858, 0.1812)),
                class = "data.frame", row.names = c(NA, -7L))

df.fit <- nls(response ~ k0 + (ki*concentration/(KI + concentration)), df, start = list(k0 = 0.001, ki = 0.18, KI = 1))
coef(df.fit)

plot <- ggplot(df, aes(concentration, response))+
  geom_point()+
  geom_smooth(method = "nls", se = F, method.args = list(formula = y ~ k0 + (ki*x/(KI + x)), 
                                                         start = list(k0 = 0.001, ki = 0.18, KI = 1)))
plot
...