注意:这可能更适合交叉验证,如果需要的话我可以把它移到那里,但我想我会先在这里尝试,因为它可能与r相关。
我正在使用非线性混合模型与
nlme
比较两组之间的生长曲线参数估计。我使用 boot_nlme()
中的 nlraa
来引导模型参数估计和预测数据的置信区间。
下面是我正在使用的代码,但带有来自
penguin.data
的 FlexParamCurve
。它没有完全相同的问题,但以可用的格式提供了代码。如果这还不够,我可以用我自己的数据进行编辑。
对于我的个人数据,我的问题源于预测数据的 CI 在渐近线处重叠(即显示没有统计差异),而根据模型和自举参数估计 CI,它们不重叠(即显示统计差异)。
我的问题是: 为什么模型参数估计的自举 CI 会与同一模型的自举预测数据 CI 产生争议?难道这是我没有完全理解bootstrap方法?或者可能还有其他我遗漏的东西(与代码相关)?
任何帮助/见解将不胜感激。
library(FlexParamCurve) #loads dataset and package 'nlme'
library(ggplot2)
library(nlraa)
library(boot)
library(dplyr)
VarFunc.Auto<-varPower(form=~fitted(.))
##creating model
richards.func <- function(age, A, Ti, k, d){
A * (1 + (d - 1) * exp(( (-k) * (age - Ti)) / ( d ^ ( d / (1 - d))))) ^ (1 / (1 - d))
}
ggplot(penguin.data, aes (x = ckage, y = weight, color = year)) +
geom_smooth()
#fixed asymptote
mod <- nlme(weight ~ SSlogis(ckage, Asym, R0, lrc),
data = penguin.data,
fixed= list(Asym ~ year,
R0 ~ year,
lrc ~ year),
random = Asym ~ 1,
start = c(Asym = 1000, 0,
R0 = 21, 0,
lrc = 1, 0),
control = list(maxIter = 100),
na.action = na.pass)
summary(mod)
peng.mdiff <- function(x, ckage = seq(0, 80, length.out = 500)){
ndat <- expand.grid(ckage = ckage,
year = c('2000','2002'),
nest = NA,
bandid = NA,
stringsAsFactors = TRUE)
prd <- predict(x, newdata = ndat, level = 0)
}
set.seed(123)
#this takes a few minutes to run on my computer
system.time(peng.bt <- boot_nlme(mod, peng.mdiff, R = 500, cores = 3))
set.seed(123)
system.time(peng.bt.ci <- confint(peng.bt, level = 0.95))
prd.df <- as.data.frame(peng.bt.ci)
prd.df <- prd.df %>%
rename_at('2.5 %', ~'lower.ci') %>%
rename_at('97.5 %', ~'upper.ci')
ndat1 <- with(peng.dat02,
expand.grid(
ckage=seq(0, 80 , length.out=500),
year = c('2000','2002'),
nest = NA,
bandid = NA
))
newX <- ndat1 %>%
mutate(prd = predict_nlme(mod, newdata = ndat1, level = 0))
comb.df1 <- cbind(prd.df, ndat1, 'prd' = newX$prd)
ci.plot <- ggplot() +
geom_ribbon(comb.df1, mapping = aes(x = ckage, ymin = lower.ci, ymax = upper.ci, fill = year ), alpha = 0.50) +
geom_line(data = newX, aes(x = ckage, y = prd, group = year), color = 'black', alpha = 0.75)
ci.plot