ช่วงความเชื่อมั่นในการทำนายสำหรับตัวแบบผสมที่ไม่ใช่เชิงเส้น (nlme)


12

ฉันต้องการได้รับช่วงความเชื่อมั่น 95% จากการทำนายของตัวแบบผสมnlmeแบบไม่เป็นเชิงเส้น ในขณะที่ไม่มีมาตรฐานใดให้ทำเช่นนี้ภายในnlmeฉันสงสัยว่ามันถูกต้องหรือไม่ที่จะใช้วิธีการของ "ช่วงการทำนายประชากร" ตามที่ระบุไว้ในบทหนังสือของ Ben Bolker ในบริบทของแบบจำลองที่เหมาะสมกับโอกาสสูงสุดตามแนวคิด resampling พารามิเตอร์ผลกระทบคงที่ตามเมทริกซ์ความแปรปรวนร่วม - ความแปรปรวนร่วมของแบบจำลองที่ติดตั้งใหม่, การจำลองการทำนายตามนี้แล้วนำ 95% เปอร์เซ็นไทล์ของการทำนายเหล่านี้เพื่อให้ได้ช่วงความมั่นใจ 95%?

รหัสการทำเช่นนี้มีลักษณะดังนี้: (ฉันที่นี่ใช้ข้อมูล 'Loblolly' จากnlmeไฟล์ช่วยเหลือ)

library(effects)
library(nlme)
library(MASS)

fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc),
    data = Loblolly,
    fixed = Asym + R0 + lrc ~ 1,
    random = Asym ~ 1,
    start = c(Asym = 103, R0 = -8.5, lrc = -3.3))

xvals=seq(min(Loblolly$age),max(Loblolly$age),length.out=100)
nresamp=1000
pars.picked = mvrnorm(nresamp, mu = fixef(fm1), Sigma = vcov(fm1)) # pick new parameter values by sampling from multivariate normal distribution based on fit
yvals = matrix(0, nrow = nresamp, ncol = length(xvals))

for (i in 1:nresamp) 
{
    yvals[i,] = sapply(xvals,function (x) SSasymp(x,pars.picked[i,1], pars.picked[i,2], pars.picked[i,3]))
} 

quant = function(col) quantile(col, c(0.025,0.975)) # 95% percentiles
conflims = apply(yvals,2,quant) # 95% confidence intervals

ตอนนี้ฉันมีขีด จำกัด ความเชื่อมั่นของฉันฉันสร้างกราฟ:

meany = sapply(xvals,function (x) SSasymp(x,fixef(fm1)[[1]], fixef(fm1)[[2]], fixef(fm1)[[3]]))

par(cex.axis = 2.0, cex.lab=2.0)
plot(0, type='n', xlim=c(3,25), ylim=c(0,65), axes=F, xlab="age", ylab="height");
axis(1, at=c(3,1:5 * 5), labels=c(3,1:5 * 5)) 
axis(2, at=0:6 * 10, labels=0:6 * 10)   

for(i in 1:14)
{
    data = subset(Loblolly, Loblolly$Seed == unique(Loblolly$Seed)[i])   
    lines(data$age, data$height, col = "red", lty=3)
}

lines(xvals,meany, lwd=3)
lines(xvals,conflims[1,])
lines(xvals,conflims[2,])

นี่คือพล็อตที่มีช่วงความมั่นใจ 95% ที่ได้มาด้วยวิธีนี้:

ข้อมูลทั้งหมด (เส้นสีแดง), ค่าเฉลี่ยและความมั่นใจ (เส้นสีดำ)

วิธีนี้ใช้ได้หรือมีวิธีอื่นหรือดีกว่าในการคำนวณช่วงความเชื่อมั่น 95% สำหรับการทำนายของตัวแบบผสมแบบไม่เชิงเส้นหรือไม่? ฉันไม่แน่ใจว่าจะจัดการกับโครงสร้างสุ่มเอฟเฟ็กต์ของโมเดลได้อย่างไร ... หนึ่งในค่าเฉลี่ยอาจจะสูงกว่าระดับเอฟเฟกต์แบบสุ่มหรือไม่? หรือมันจะโอเคที่จะมีช่วงความมั่นใจสำหรับเรื่องเฉลี่ยซึ่งดูเหมือนจะใกล้เคียงกับสิ่งที่ฉันมีอยู่ตอนนี้


ไม่มีคำถามเลย โปรดชัดเจนเกี่ยวกับสิ่งที่คุณถาม
adunaic

ฉันพยายามที่จะกำหนดคำถามให้แม่นยำยิ่งขึ้นในตอนนี้ ...
Piet van den Berg

ดังที่ฉันได้แสดงความคิดเห็นเมื่อคุณถามเรื่องนี้ก่อนหน้านี้เกี่ยวกับการโอเวอร์โฟลว์แบบสแต็คฉันไม่เชื่อว่าข้อสรุปเชิงบรรทัดฐานสำหรับพารามิเตอร์ที่ไม่ใช่เชิงเส้นนั้นมีความชอบธรรม
Roland

ฉันไม่ได้อ่านหนังสือของเบ็น แต่ดูเหมือนว่าเขาจะไม่อ้างถึงโมเดลผสมในบทนี้ บางทีคุณควรชี้แจงเรื่องนี้เมื่ออ้างอิงหนังสือของเขา
Roland

ใช่สิ่งนี้อยู่ในบริบทของแบบจำลองความเป็นไปได้สูงสุด แต่ความคิดควรเหมือนกัน ... ฉันได้ชี้แจงตอนนี้ ...
Piet van den Berg

คำตอบ:


10

สิ่งที่คุณทำที่นี่ดูสมเหตุสมผล คำตอบสั้น ๆ คือส่วนใหญ่ปัญหาของการทำนายช่วงความมั่นใจจากโมเดลผสมและจากโมเดลที่ไม่ใช่เชิงเส้นนั้นมีมุมฉากมากขึ้นหรือน้อยลงนั่นคือคุณต้องกังวลเกี่ยวกับปัญหาทั้งสองชุด แต่พวกเขาไม่เข้าใจ จาก) โต้ตอบด้วยวิธีแปลก ๆ

  • ปัญหาตัวแบบผสม : คุณพยายามคาดคะเนที่ระดับประชากรหรือระดับกลุ่มหรือไม่? คุณอธิบายความแปรปรวนในพารามิเตอร์สุ่มเอฟเฟกต์ได้อย่างไร คุณมีข้อสังเกตในระดับกลุ่มหรือไม่?
  • ปัญหาของโมเดลที่ไม่เชิงเส้น : การกระจายตัวตัวอย่างของพารามิเตอร์เป็นปกติหรือไม่ ฉันจะบัญชีเกี่ยวกับความไม่เชิงเส้นเมื่อเผยแพร่ข้อผิดพลาดได้อย่างไร

ตลอดเวลาฉันจะสมมติว่าคุณคาดคะเนในระดับประชากรและสร้างช่วงความมั่นใจเป็นระดับประชากร - หรืออีกนัยหนึ่งคุณกำลังพยายามที่จะพล็อตค่าที่ทำนายไว้ของกลุ่มทั่วไปและไม่รวมถึงความแปรปรวนระหว่างกลุ่มในความมั่นใจของคุณ ช่วงเวลา สิ่งนี้ช่วยลดความซับซ้อนของปัญหาแบบผสม แปลงต่อไปนี้เปรียบเทียบสามวิธี (ดูด้านล่างสำหรับการถ่ายโอนข้อมูลรหัส):

  • ช่วงเวลาการคาดการณ์ประชากร : นี่เป็นวิธีการที่คุณลองมาด้านบน มันถือว่าแบบจำลองนั้นถูกต้องและการแจกแจงการสุ่มตัวอย่างของพารามิเตอร์ผลคงที่คือตัวแปรหลายตัวแปรปกติ มันไม่สนใจความไม่แน่นอนในพารามิเตอร์สุ่มเอฟเฟกต์
  • bootstrapping : ฉันติดตั้ง bootstrapping ตามลำดับชั้น; เราสุ่มตัวอย่างใหม่ทั้งในระดับกลุ่มและภายในกลุ่ม การสุ่มตัวอย่างภายในกลุ่มสุ่มตัวอย่างค่าตกค้างและเพิ่มกลับไปยังการทำนาย วิธีนี้ทำให้สมมติฐานน้อยที่สุด
  • วิธีการเดลต้า : สิ่งนี้ถือว่าทั้งความแปรปรวนแบบหลายตัวแปรของการสุ่มตัวอย่างแบบกระจายและความไม่เชิงเส้นนั้นอ่อนแอพอที่จะอนุญาตให้มีการประมาณอันดับสอง

เราสามารถทำbootstra พาราพาราเมทริก ...

นี่คือ CIs ที่พล็อตพร้อมกับข้อมูล ...

ป้อนคำอธิบายรูปภาพที่นี่

... แต่เราแทบจะไม่เห็นความแตกต่าง

ซูมเข้าโดยการลบค่าที่คาดการณ์ไว้ (red = bootstrap, blue = PPI, cyan = delta)

ป้อนคำอธิบายรูปภาพที่นี่

ในกรณีนี้ช่วงบูทสแตรปนั้นแคบจริง ๆ (เช่นสมมุติว่าการกระจายตัวตัวอย่างของพารามิเตอร์จริง ๆ แล้วบางกว่าหางเล็กน้อยกว่าปกติ) ในขณะที่ PPI และช่วงเดลต้ามีความคล้ายคลึงกันมาก

library(nlme)
library(MASS)

fm1 <- nlme(height ~ SSasymp(age, Asym, R0, lrc),
            data = Loblolly,
            fixed = Asym + R0 + lrc ~ 1,
            random = Asym ~ 1,
            start = c(Asym = 103, R0 = -8.5, lrc = -3.3))

xvals <-  with(Loblolly,seq(min(age),max(age),length.out=100))
nresamp <- 1000
## pick new parameter values by sampling from multivariate normal distribution based on fit
pars.picked <- mvrnorm(nresamp, mu = fixef(fm1), Sigma = vcov(fm1))

## predicted values: useful below
pframe <- with(Loblolly,data.frame(age=xvals))
pframe$height <- predict(fm1,newdata=pframe,level=0)

## utility function
get_CI <- function(y,pref="") {
    r1 <- t(apply(y,1,quantile,c(0.025,0.975)))
    setNames(as.data.frame(r1),paste0(pref,c("lwr","upr")))
}

set.seed(101)
yvals <- apply(pars.picked,1,
               function(x) { SSasymp(xvals,x[1], x[2], x[3]) }
)
c1 <- get_CI(yvals)

## bootstrapping
sampfun <- function(fitted,data,idvar="Seed") {
    pp <- predict(fitted,levels=1)
    rr <- residuals(fitted)
    dd <- data.frame(data,pred=pp,res=rr)
    ## sample groups with replacement
    iv <- levels(data[[idvar]])
    bsamp1 <- sample(iv,size=length(iv),replace=TRUE)
    bsamp2 <- lapply(bsamp1,
        function(x) {
        ## within groups, sample *residuals* with replacement
        ddb <- dd[dd[[idvar]]==x,]
        ## bootstrapped response = pred + bootstrapped residual
        ddb$height <- ddb$pred +
            sample(ddb$res,size=nrow(ddb),replace=TRUE)
        return(ddb)
    })
    res <- do.call(rbind,bsamp2)  ## collect results
    if (is(data,"groupedData"))
        res <- groupedData(res,formula=formula(data))
    return(res)
}

pfun <- function(fm) {
    predict(fm,newdata=pframe,level=0)
}

set.seed(101)
yvals2 <- replicate(nresamp,
                    pfun(update(fm1,data=sampfun(fm1,Loblolly,"Seed"))))
c2 <- get_CI(yvals2,"boot_")

## delta method
ss0 <- with(as.list(fixef(fm1)),SSasymp(xvals,Asym,R0,lrc))
gg <- attr(ss0,"gradient")
V <- vcov(fm1)
delta_sd <- sqrt(diag(gg %*% V %*% t(gg)))
c3 <- with(pframe,data.frame(delta_lwr=height-1.96*delta_sd,
                             delta_upr=height+1.96*delta_sd))

pframe <- data.frame(pframe,c1,c2,c3)

library(ggplot2); theme_set(theme_bw())
ggplot(Loblolly,aes(age,height))+
    geom_line(alpha=0.2,aes(group=Seed))+
    geom_line(data=pframe,col="red")+
    geom_ribbon(data=pframe,aes(ymin=lwr,ymax=upr),colour=NA,alpha=0.3,
                fill="blue")+
    geom_ribbon(data=pframe,aes(ymin=boot_lwr,ymax=boot_upr),
                colour=NA,alpha=0.3,
                fill="red")+
    geom_ribbon(data=pframe,aes(ymin=delta_lwr,ymax=delta_upr),
                colour=NA,alpha=0.3,
                fill="cyan")


ggplot(Loblolly,aes(age))+
    geom_hline(yintercept=0,lty=2)+
    geom_ribbon(data=pframe,aes(ymin=lwr-height,ymax=upr-height),
                colour="blue",
                fill=NA)+
    geom_ribbon(data=pframe,aes(ymin=boot_lwr-height,ymax=boot_upr-height),
                colour="red",
                fill=NA)+
    geom_ribbon(data=pframe,aes(ymin=delta_lwr-height,ymax=delta_upr-height),
                colour="cyan",
                fill=NA)

ดังนั้นหากฉันเข้าใจอย่างถูกต้องนี่จะเป็นช่วงความมั่นใจในกลุ่มทั่วไป คุณจะมีความคิดใด ๆ ว่าจะรวมรูปแบบระหว่างกลุ่มในช่วงความมั่นใจของคุณหรือไม่ ควรหนึ่งค่าเฉลี่ยมากกว่าระดับผลกระทบแบบสุ่มแล้ว?
Tom Wenseleers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.