【问题标题】:How to calculate confidence intervals for Nonlinear Least Squares in r?如何计算r中非线性最小二乘的置信区间?
【发布时间】:2020-04-21 10:25:40
【问题描述】:

我在预测 r 中的置信区间 ros 和 nls 时遇到了一些麻烦。

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")

当我运行它时,它没有显示错误,但我得到的区间只是一个适合的向量,没有上下置信区间。

【问题讨论】:

  • 您可以发布示例数据吗?请使用dput(data) 的输出编辑问题。或者,如果 dput(head(data, 20)) 的输出太大。
  • predict.nls 的文档对se.fit 的参数进行了如下说明:“目前此参数被忽略。”.
  • 是的,我知道,我只是为了以防万一

标签: r nls


【解决方案1】:

我知道如何执行此操作的方法有 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()

另一种选择是使用“drc”pacakge(又名剂量反应曲线)进行模型拟合和预测。这个包使用需要使用(或创建)的内置启动函数,但是类“drc”的对象有许多可以使用的有用方法——其中之一是 predict.drc,它支持置信区间(尽管仅适用于一些内置自启动器)。包“drc”的示例:

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()

有关“drc”包的更多信息:journal paper,博客文章describing custom self-starts for drc,以及包docs

【讨论】:

    【解决方案2】:

    非线性置信区间可以通过propagate包模拟获得:

    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")
    

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 2018-12-27
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 2015-01-22
      • 1970-01-01
      相关资源
      最近更新 更多