Как рассчитать доверительные интервалы для нелинейных наименьших квадратов в r? - PullRequest
1 голос
/ 21 апреля 2020

У меня возникли проблемы с предсказанием доверительных интервалов. Ros и nls в r.

pl <- ggplot(data) +  geom_point(aes(x=date, y=cases),size=2, colour="black") + xlab("Date") + ylab("Cases")  
model = nls(cases ~ SSlogis(log(date), Asym, xmid, scal), data= data )


new.data = data.frame(date=c(1:100))
interval <- predict(model, newdata = new.data, se.fit = TRUE, interval = "confidence", level= 0.9)

new.data[c("fit","lwr.conf", "upr.conf")] <- interval 

pl +   
  geom_ribbon(data=new.data, aes(x=date, ymin=lwr.pred, ymax=upr.pred), alpha=0.05, inherit.aes=F, fill="blue")

Когда я запускаю его, он не показывает ошибок, но получаемый интервал - это просто вектор с подгонкой , нет верхнего и нижнего доверительных интервалов.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Есть 3 способа, которыми я знаю, как это сделать, один из них описан в другом ответе. Вот еще несколько вариантов. Этот первый использует nls (), чтобы соответствовать модели, и investr :: predFit, чтобы делать прогнозы и CI:

 library(tidyverse)
 library(investr)
 data <- tibble(date = 1:7,
                cases = c(0, 0, 1, 4, 7, 8.5, 8.5))

    model <- nls(cases ~ SSlogis(log(date), Asym, xmid, scal), data= data )
    new.data <- data.frame(date=seq(1, 10, by = 0.1))
    interval <- as_tibble(predFit(model, newdata = new.data, interval = "confidence", level= 0.9)) %>% 
      mutate(date = new.data$date)

    p1 <- ggplot(data) +  geom_point(aes(x=date, y=cases),size=2, colour="black") + xlab("Date") + ylab("Cases")  

    p1+
      geom_line(data=interval, aes(x = date, y = fit ))+
      geom_ribbon(data=interval, aes(x=date, ymin=lwr, ymax=upr), alpha=0.5, inherit.aes=F, fill="blue")+
      theme_classic()

enter image description here

Другой вариант - выполнить подгонку модели и прогнозирование с помощью 'dr c' pacakge (он же кривые доза-эффект). В этом пакете используются встроенные начальные функции, которые необходимо использовать (или создавать), но объект класса 'dr c' имеет много полезных методов, которые можно использовать - один из них - предикат.dr c, который поддерживает доверительные интервалы (хотя только для некоторых из встроенных самозапускателей). Пример с пакетом 'dr c':

library(drc)
model_drc <- drm(cases~date, data = data, fct=LL.4())
predict_drc <- as_tibble(predict(model_drc, newdata = new.data, interval = "confidence", level = 0.9)) %>% 
  mutate(date = new.data$date)

p1+
  geom_line(data=predict_drc, aes(x = date, y = Prediction ))+
  geom_ribbon(data=predict_drc, aes(x=date, ymin=Lower, ymax=Upper), alpha=0.5, inherit.aes=F, fill="red")+
  ggtitle("with package 'drc'")+
  theme_classic()

enter image description here

Дополнительная информация о пакете 'dr c': журнал статья , статья в блоге , описывающая пользовательские автозапуски для dr c, и пакет docs

0 голосов
/ 21 апреля 2020

Нелинейные доверительные интервалы могут быть получены путем моделирования с пакетом Распространение :

library("propagate")

x  <- c(25, 25, 10, 10, 5, 5, 2.5, 2.5, 1.25, 1.25)
y <- c(0.0998, 0.0948, 0.076, 0.0724, 0.0557,
       0.0575, 0.0399, 0.0381, 0.017, 0.0253)

m <- nls(y ~ SSmicmen(x, Vm, K), trace = TRUE)

x1 <- seq(0, 25, length = 100)
plot(x, y, xlim = c(0, 25), ylim = c(0, 0.1))
lines(x1, predict(m, data.frame(S = x1)), col = "red")

y.conf <- predictNLS(m, newdata=data.frame(x=x1), interval="confidence", alpha=0.05, nsim=10000)$summary
y.pred <- predictNLS(m, newdata=data.frame(x=x1), interval="prediction", alpha=0.05, nsim=10000)$summary

matlines(x1, y.conf[,c("Sim.2.5%", "Sim.97.5%")], col="red", lty="dashed")
matlines(x1, y.pred[,c("Sim.2.5%", "Sim.97.5%")], col="blue", lty="solid")

enter image description here

...