Примечание. Это может быть более подходящим для перекрестной проверки, и я могу переместить его туда, если потребуется, но я решил сначала попробовать здесь, поскольку это может быть связано с r.
Я сравниваю оценки параметров кривой роста между двумя группами, используя нелинейные смешанные модели с nlme. Я использую boot_nlme() из nlraa для начальной загрузки доверительных интервалов для оценок параметров модели и прогнозируемых данных.
Ниже приведен код, который я использую, но с penguin.data из FlexParamCurve. Он не имеет такой же проблемы, но предоставляет код в удобном формате. Если этого недостаточно, я могу редактировать свои собственные данные.
Что касается моих личных данных, моя проблема связана с перекрытием CI прогнозируемых данных (т. е. отсутствием статистической разницы) на асимптоте, когда в соответствии с моделью и оценочными CI с начальной загрузкой параметров они не перекрываются (т. е. не показывают статистическую разницу).
Мой вопрос: Почему загружаемые CI оценок параметров модели оспаривают CI прогнозируемых данных из той же модели? Может быть, я не совсем понимаю метод начальной загрузки? Или может быть что-то еще, что мне не хватает (связанное с кодом)?
Любая помощь/понимание будет оценено по достоинству.
library(FlexParamCurve) #loads dataset and package 'nlme'
library(ggplot2)
library(nlraa)
library(boot)
library(dplyr)
library(car)
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(penguin.data,
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
Я признаю, что, несмотря на то, что вы приняли ответ, я все еще не совсем понимаю, в чем заключается ваш вопрос. График показывает, что прогнозируемые значения сильно различаются для больших возрастов. summary(mod) показывает, что Asym.year2002, измеряющий различия в асимптотах между 2000 и 2002 годами, велик (169 [грамм?]) и весьма значим...
Я не был уверен, был ли мой вопрос более статистически значимым или я делал что-то не так в своем коде r (в первую очередь, я неправильно понимал перекрывающиеся CI), поэтому я предоставил воспроизводимый образец своего кода, используя penguin.data. В моих реальных данных две кривые расположены намного ближе друг к другу и имеют некоторое перекрытие CI, что было моей главной заботой в то время. Это помогает?
В этом случае звучит так, как будто ответ @RobertLong, вероятно, имеет значение; если, скажем, значение p равно 0,03 и 95% доверительные интервалы слегка перекрываются, это полностью соответствует ожиданиям.





Что касается моих личных данных, моя проблема связана с перекрытием CI прогнозируемых данных (т. е. отсутствием статистической разницы) на асимптоте, когда в соответствии с моделью и оценочными CI с начальной загрузкой параметров они не перекрываются (т. е. не показывают статистическую разницу).
Перекрытие доверительных интервалов не означает отсутствия статистически значимой разницы. Доверительные интервалы могут перекрываться, и при этом все равно может быть статистически значимая разница. То есть 95% доверительные интервалы все равно могут перекрываться, и разница будет существенно отличаться на уровне 5%.
Подробности смотрите здесь , здесь , здесь , здесь и здесь.
Спасибо! Я думаю, что использовал неправильную терминологию при поиске ответа, а также полагался на визуальную предвзятость, которую пытаюсь разрушить. Цените ссылки - это очень помогло.
Не волнуйтесь, Эмили, рада помочь, хотя я все равно советую вам использовать визуализацию в своей работе :)
когда я запускаю
confint(peng.bt, level = 0.95)), я получаю сообщение «Нет применимого метода для vcov, примененного к объекту класса «boot». Вы что-то забыли сказать нам, чтобы мы загрузили? (Можетlibrary("car")?) У меня тоже нетpeng.dat02...