गैर-रेखीय मिश्रित मॉडल (nlme) के पूर्वानुमानों पर विश्वास अंतराल


12

मैं एक गैर-रेखीय मिश्रित nlmeमॉडल की भविष्यवाणियों पर 95% विश्वास अंतराल प्राप्त करना चाहूंगा । जैसा कि इसके भीतर करने के लिए कुछ भी मानक प्रदान नहीं किया गया है nlme, मैं सोच रहा था कि क्या "जनसंख्या पूर्वानुमान अंतराल" की विधि का उपयोग करना सही है, जैसा कि बेन बोल्कर की पुस्तक के अध्याय में उल्लिखित है , मॉडल के संदर्भ में अधिकतम संभावना के साथ फिट होने के संदर्भ में , विचार के आधार पर फिट किए गए मॉडल के विचरण-सहसंयोजक मैट्रिक्स के आधार पर निश्चित प्रभाव मापदंडों को फिर से खोलना, इसके आधार पर भविष्यवाणियों का अनुकरण करना, और फिर 95% विश्वास अंतराल प्राप्त करने के लिए इन भविष्यवाणियों के 95% प्रतिशत लेना?

ऐसा करने के लिए कोड निम्नानुसार है: (मैं यहाँ 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% विश्वास अंतराल की गणना करने के लिए कोई अन्य या बेहतर दृष्टिकोण हैं? मुझे पूरी तरह से यकीन नहीं है कि मॉडल के यादृच्छिक प्रभाव के साथ कैसे निपटना है ... क्या एक औसत शायद यादृच्छिक प्रभाव स्तरों पर होना चाहिए? या एक औसत विषय के लिए आत्मविश्वास अंतराल होना ठीक होगा, जो कि मेरे पास अब जो है, उसके करीब प्रतीत होगा?


यहाँ कोई सवाल नहीं है। कृपया स्पष्ट करें कि आप क्या पूछ रहे हैं।
12

मैंने प्रश्न को और अधिक सटीक रूप से तैयार करने की कोशिश की ...
पीटी वैन डेन बर्ग

जैसा कि मैंने टिप्पणी की है जब आपने स्टैक ओवरफ्लो पर यह पहले पूछा था, तो मुझे यकीन नहीं है कि गैर-रैखिक मापदंडों के लिए एक सामान्य धारणा उचित है।
रोलैंड

मैंने बेन की किताब नहीं पढ़ी है, लेकिन वह इस अध्याय में मिश्रित मॉडल को संदर्भित नहीं करता है। हो सकता है कि आपको उनकी पुस्तक का संदर्भ देते समय इसे स्पष्ट करना चाहिए।
रोलैंड

हाँ यह अधिकतम संभावना मॉडल के संदर्भ में था, लेकिन विचार समान होना चाहिए ... मैंने इसे अभी स्पष्ट कर दिया है ...
पीटी वैन डेन बर्ग

जवाबों:


10

आपने यहां जो किया है वह उचित लग रहा है। संक्षिप्त उत्तर यह है कि अधिकांश भाग के लिए मिश्रित मॉडल और नॉनलाइनर मॉडल से आत्मविश्वास अंतराल की भविष्यवाणी करने के मुद्दे अधिक या कम ऑर्थोगोनल हैं , अर्थात, आपको समस्याओं के दोनों सेट के बारे में चिंता करने की आवश्यकता है, लेकिन वे नहीं जानते (कि मुझे पता है) के) किसी भी अजीब तरीके से बातचीत।

  • मिश्रित मॉडल मुद्दे : क्या आप जनसंख्या या समूह स्तर पर भविष्यवाणी करने की कोशिश कर रहे हैं? आप यादृच्छिक-प्रभाव मापदंडों में परिवर्तनशीलता के लिए कैसे खाते हैं? आप समूह-स्तरीय टिप्पणियों पर कंडीशनिंग कर रहे हैं या नहीं?
  • Nonlinear मॉडल के मुद्दे : मापदंडों का नमूना वितरण सामान्य है? त्रुटि का प्रचार करते समय मैं ग़ैरजिम्मेदारी के लिए कैसे खाता हूँ?

इसके दौरान, मैं मान लूंगा कि आप जनसंख्या स्तर पर भविष्यवाणी कर रहे हैं और जनसंख्या स्तर के रूप में आत्मविश्वास अंतराल का निर्माण कर रहे हैं - दूसरे शब्दों में आप एक विशिष्ट समूह के पूर्वानुमानित मूल्यों की साजिश करने की कोशिश कर रहे हैं , और आपके आत्मविश्वास में समूह-भिन्नता को शामिल नहीं किया गया है। अंतराल। यह मिश्रित-मॉडल मुद्दों को सरल करता है। निम्नलिखित भूखंड तीन दृष्टिकोणों की तुलना करते हैं (कोड डंप के लिए नीचे देखें):

  • जनसंख्या पूर्वानुमान अंतराल : यह वह तरीका है जिसे आपने ऊपर आजमाया है। यह मानता है कि मॉडल सही है और यह कि नियत-प्रभाव मापदंडों के नमूने वितरण बहुभिन्नरूपी सामान्य हैं; यह यादृच्छिक-प्रभाव मापदंडों में अनिश्चितता को भी अनदेखा करता है
  • बूटस्ट्रैपिंग : मैंने श्रेणीबद्ध बूटस्ट्रैपिंग को लागू किया; हम समूहों के स्तर पर और समूहों के भीतर दोनों को फिर से जोड़ते हैं। भीतर समूह नमूना अवशेषों का नमूना लेता है और उन्हें भविष्यवाणियों में वापस जोड़ता है। यह दृष्टिकोण सबसे कम धारणा बनाता है।
  • डेल्टा विधि : यह नमूना वितरण के बहुभिन्नरूपी सामान्यता दोनों को मानती है और यह कि दूसरे क्रम के सन्निकटन की अनुमति देने के लिए निर्बलता काफी कमजोर है।

हम पैरामीट्रिक बूटस्ट्रैपिंग भी कर सकते हैं ...

यहां डेटा के साथ-साथ सीआई किए गए हैं ...

यहाँ छवि विवरण दर्ज करें

... लेकिन हम शायद ही अंतर देख सकते हैं।

अनुमानित मूल्यों (लाल = बूटस्ट्रैप, नीला = पीपीआई, सियान = डेल्टा विधि) को घटाकर ज़ूम इन करना

यहाँ छवि विवरण दर्ज करें

इस मामले में बूटस्ट्रैप अंतराल वास्तव में सबसे कम है (उदाहरण के लिए मापदंडों का नमूना वितरण वास्तव में सामान्य से थोड़ा पतला है ), जबकि पीपीआई और डेल्टा-विधि अंतराल एक दूसरे के समान हैं।

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)

इसलिए अगर मैं सही ढंग से समझूं तो यह एक विशिष्ट समूह पर विश्वास अंतराल होगा। क्या आपको इस बात का भी अंदाजा होगा कि आपके आत्मविश्वास के अंतराल में समूह-भिन्नता को कैसे शामिल किया जाएगा? एक यादृच्छिक प्रभाव के स्तर पर औसत तो चाहिए?
टॉम वेन्सलेर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.