2012-12-12 10 views
28

qqmath फ़ंक्शन lmer पैकेज से आउटपुट का उपयोग करके यादृच्छिक प्रभावों के महान कैटरपिलर प्लॉट बनाता है। यही है, qqmath एक पदानुक्रमित मॉडल से अंतराल को बिंदु अनुमान के चारों ओर अपनी त्रुटियों के साथ साजिश करने में बहुत अच्छा है। Lmer और qqmath फ़ंक्शंस का एक उदाहरण डाइस्टफ नामक lme4 पैकेज में अंतर्निहित डेटा का उपयोग कर नीचे दिया गया है। कोड ggmath समारोह का उपयोग कर पदानुक्रमित मॉडल और एक अच्छी साजिश का उत्पादन करेगा।आर में, qqmath या dotplot का उपयोग कर लेमर (lme4 पैकेज) से यादृच्छिक प्रभाव की साजिश रुकती है: इसे फैंसी कैसे दिखाना है?

library("lme4") 
data(package = "lme4") 

# Dyestuff 
# a balanced one-way classiï¬cation of Yield 
# from samples produced from six Batches 

summary(Dyestuff)    

# Batch is an example of a random effect 
# Fit 1-way random effects linear model 
fit1 <- lmer(Yield ~ 1 + (1|Batch), Dyestuff) 
summary(fit1) 
coef(fit1) #intercept for each level in Batch 

# qqplot of the random effects with their variances 
qqmath(ranef(fit1, postVar = TRUE), strip = FALSE)$Batch 

कोड की अंतिम पंक्ति प्रत्येक अनुमान के आसपास त्रुटि के साथ प्रत्येक अवरोध का वास्तव में एक अच्छा साजिश उत्पन्न करती है। लेकिन qqmath फ़ंक्शन को स्वरूपित करना बहुत मुश्किल लगता है, और मैं साजिश को प्रारूपित करने के लिए संघर्ष कर रहा हूं। मैं कुछ सवाल है कि मैं उत्तर नहीं दे सकता के साथ आ गया है, और मुझे लगता है कि अगर वे से lmer/qqmath संयोजन का उपयोग कर रहे हैं दूसरों को भी फायदा हो सकता है:

  1. वहाँ ऊपर qqmath समारोह लेने के लिए एक रास्ता है और कुछ विकल्प जोड़ें, जैसे कि कुछ बिंदुओं को खाली बनाम भरे हुए, या विभिन्न बिंदुओं के लिए अलग-अलग रंग जोड़ें? उदाहरण के लिए, क्या आप बैच वैरिएबल के ए, बी, और सी के लिए अंक बना सकते हैं, लेकिन फिर शेष बिंदु खाली हैं?
  2. क्या प्रत्येक बिंदु के लिए अक्ष लेबल जोड़ना संभव है (उदाहरण के लिए शीर्ष या दाएं वाई धुरी के साथ) उदाहरण के लिए?
  3. मेरे डेटा में 45 अंतराल के करीब है, इसलिए लेबल के बीच अंतर को जोड़ना संभव है ताकि वे एक दूसरे में नहीं चल सकें? मुख्य रूप से, मुझे ग्राफ़ पर बिंदुओं के बीच अंतर/लेबलिंग में रूचि है, जो ggmath फ़ंक्शन में बोझिल/असंभव प्रतीत होता है।

अब तक, qqmath फ़ंक्शन में कोई अतिरिक्त विकल्प जोड़ने से त्रुटियां उत्पन्न होती हैं जहां मुझे मानक प्लॉट होने पर त्रुटियां नहीं मिलतीं, इसलिए मुझे नुकसान होता है।

ALSO, अगर आपको लगता है कि हल्का उत्पादन से अंतःक्रियाओं की साजिश रचने के लिए एक बेहतर पैकेज/फ़ंक्शन है, तो मुझे यह सुनना अच्छा लगेगा! (उदाहरण के लिए, क्या आप डॉटप्लॉट का उपयोग करके 1-3 अंक कर सकते हैं?)

धन्यवाद।

संपादित करें: यदि यह उचित रूप से स्वरूपित किया जा सकता है तो मैं वैकल्पिक डॉटप्लॉट के लिए भी खुला हूं। मुझे बस एक ggmath साजिश के रूप में पसंद है, तो मैं इसके बारे में एक सवाल से शुरू कर रहा हूँ।

उत्तर

28

इसी तरह के ग्राफ को आकर्षित करने के लिए लाइब्रेरी ggplot2 का उपयोग करने की संभावना है और फिर आप अपनी साजिश की उपस्थिति समायोजित कर सकते हैं।

पहला, ranef ऑब्जेक्ट randoms के रूप में सहेजा गया है। फिर इंटरसेप्ट के भिन्नता ऑब्जेक्ट qq में सहेजी जाती हैं।

randoms<-ranef(fit1, postVar = TRUE) 
qq <- attr(ranef(fit1, postVar = TRUE)[[1]], "postVar") 

ऑब्जेक्ट rand.interc में स्तर के नामों के साथ केवल यादृच्छिक अंतःक्रियाएं हैं।

rand.interc<-randoms$Batch 

सभी ऑब्जेक्ट्स एक डेटा फ्रेम में डाल दिए जाते हैं। त्रुटि अंतराल के लिए sd.interc को भिन्नता के 2 गुना वर्ग रूट के रूप में गणना की जाती है।

df<-data.frame(Intercepts=randoms$Batch[,1], 
       sd.interc=2*sqrt(qq[,,1:length(qq)]), 
       lev.names=rownames(rand.interc)) 

आप की जरूरत है कि अवरोध मूल्य तो lev.names पुनर्क्रमित किया जाना चाहिए के अनुसार साजिश में आदेश दिया रहे हैं।यदि स्तरों के अंतराल को आदेशों के आधार पर आदेश दिया जाना चाहिए तो इस पंक्ति को छोड़ा जा सकता है।

df$lev.names<-factor(df$lev.names,levels=df$lev.names[order(df$Intercepts)]) 

यह कोड साजिश पैदा करता है। कारक स्तर के अनुसार अब अंक shape से भिन्न होंगे।

library(ggplot2) 
p <- ggplot(df,aes(lev.names,Intercepts,shape=lev.names)) 

#Added horizontal line at y=0, error bars to points and points with size two 
p <- p + geom_hline(yintercept=0) +geom_errorbar(aes(ymin=Intercepts-sd.interc, ymax=Intercepts+sd.interc), width=0,color="black") + geom_point(aes(size=2)) 

#Removed legends and with scale_shape_manual point shapes set to 1 and 16 
p <- p + guides(size=FALSE,shape=FALSE) + scale_shape_manual(values=c(1,1,1,16,16,16)) 

#Changed appearance of plot (black and white theme) and x and y axis labels 
p <- p + theme_bw() + xlab("Levels") + ylab("") 

#Final adjustments of plot 
p <- p + theme(axis.text.x=element_text(size=rel(1.2)), 
       axis.title.x=element_text(size=rel(1.3)), 
       axis.text.y=element_text(size=rel(1.2)), 
       panel.grid.minor=element_blank(), 
       panel.grid.major.x=element_blank()) 

#To put levels on y axis you just need to use coord_flip() 
p <- p+ coord_flip() 
print(p) 

enter image description here

+0

बहुत बहुत धन्यवाद! यह बहुत अच्छा लग रहा है। लेकिन इससे पहले कि मैं बक्षीस देता हूं, मुझे दो त्रुटियां मिल रही हैं जो कहती हैं: फ़ंक्शन "गाइड" नहीं ढूंढ सका और आपके प्लॉट कोड से फ़ंक्शन "थीम" नहीं मिला। मेरे पास ggplot2 और तराजू के लिए पुस्तकालय हैं, लेकिन मुझे अभी भी त्रुटियां मिलती हैं। कोई विचार क्यों होगा? क्या ये एक अलग पैकेज हैं? मैं अभी भी एक साजिश मुद्रित कर सकता हूं लेकिन यह त्रुटियों के कारण समान नहीं है।साथ ही, अक्षों को फ़्लिप करना संभव है ताकि स्तर वाई अक्ष पर हो (और त्रुटि बार क्षैतिज हों)? –

+1

आपको ggplot (और स्केल) के अपने संस्करण को अपडेट करना चाहिए। 'विषय' ('opts' के बजाय) – mnel

+0

हम्म के उपयोग सहित नवीनतम संस्करणों में बड़े बदलाव हुए हैं, मैंने अपने सभी पैकेज अपडेट किए हैं, और यह अभी भी काम नहीं करता है। मैंने पुनः प्रयास करने से पहले आर को बंद करने की कोशिश की; आर स्टूडियो में कोड भी कोशिश की लेकिन यह काम नहीं करता है:/ –

32

Didzis 'जवाब बहुत अच्छा है! बस इसे थोड़ा सा लपेटने के लिए, मैंने इसे अपने स्वयं के फ़ंक्शन में रखा जो qqmath.ranef.mer() और dotplot.ranef.mer() जैसे बहुत से व्यवहार करता है। Didzis के जवाब के अलावा, यह कई सहसंबंधित यादृच्छिक प्रभावों के साथ मॉडल को भी संभालता है (जैसे qqmath() और dotplot() करें)। qqmath() लिए तुलना:

require(lme4)       ## for lmer(), sleepstudy 
fit <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy) 
ggCaterpillar(ranef(fit, postVar=TRUE)) ## using ggplot2 
qqmath(ranef(fit, postVar=TRUE))   ## for comparison 

enter image description here

तुलना dotplot() लिए: - जो कुछ dotplot()

ggCaterpillar(ranef(fit, postVar=TRUE), QQ=FALSE) 
dotplot(ranef(fit, postVar=TRUE)) 

enter image description here

कभी कभी, यह यादृच्छिक प्रभाव के लिए अलग तराजू के लिए उपयोगी हो सकता है लागू करता है। जब मैंने इसे आराम करने की कोशिश की, तो मुझे फ़ेसटिंग बदलनी पड़ी (यह answer देखें)।

ggCaterpillar(ranef(fit, postVar=TRUE), QQ=FALSE, likeDotplot=FALSE) 

enter image description here

## re = object of class ranef.mer 
ggCaterpillar <- function(re, QQ=TRUE, likeDotplot=TRUE) { 
    require(ggplot2) 
    f <- function(x) { 
     pv <- attr(x, "postVar") 
     cols <- 1:(dim(pv)[1]) 
     se <- unlist(lapply(cols, function(i) sqrt(pv[i, i, ]))) 
     ord <- unlist(lapply(x, order)) + rep((0:(ncol(x) - 1)) * nrow(x), each=nrow(x)) 
     pDf <- data.frame(y=unlist(x)[ord], 
          ci=1.96*se[ord], 
          nQQ=rep(qnorm(ppoints(nrow(x))), ncol(x)), 
          ID=factor(rep(rownames(x), ncol(x))[ord], levels=rownames(x)[ord]), 
          ind=gl(ncol(x), nrow(x), labels=names(x))) 

     if(QQ) { ## normal QQ-plot 
      p <- ggplot(pDf, aes(nQQ, y)) 
      p <- p + facet_wrap(~ ind, scales="free") 
      p <- p + xlab("Standard normal quantiles") + ylab("Random effect quantiles") 
     } else { ## caterpillar dotplot 
      p <- ggplot(pDf, aes(ID, y)) + coord_flip() 
      if(likeDotplot) { ## imitate dotplot() -> same scales for random effects 
       p <- p + facet_wrap(~ ind) 
      } else {   ## different scales for random effects 
       p <- p + facet_grid(ind ~ ., scales="free_y") 
      } 
      p <- p + xlab("Levels") + ylab("Random effects") 
     } 

     p <- p + theme(legend.position="none") 
     p <- p + geom_hline(yintercept=0) 
     p <- p + geom_errorbar(aes(ymin=y-ci, ymax=y+ci), width=0, colour="black") 
     p <- p + geom_point(aes(size=1.2), colour="blue") 
     return(p) 
    } 

    lapply(re, f) 
} 
+0

यह अविश्वसनीय रूप से अच्छी तरह से काम करता है। लेकिन आउटपुट टेबल बनाने के बारे में क्या, लेटेक्स के लिए कहें? – bshor

+0

@caracal जब आप करते हैं 1.96 * से [ord] आपको प्रत्येक समूह में अवलोकनों की संख्या को ध्यान में रखने की आवश्यकता क्यों नहीं है? – user3022875

12

यह करने के लिए एक और तरीका है यादृच्छिक प्रभाव से प्रत्येक के वितरण से नकली मान निकालने और उन साजिश है। merTools पैकेज का उपयोग करके, आसानी से lmer या glmer ऑब्जेक्ट से सिमुलेशन प्राप्त करना संभव है, और उन्हें साजिश करने के लिए।

library(lme4); library(merTools)  ## for lmer(), sleepstudy 
fit <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy) 
randoms <- REsim(fit, n.sims = 500) 

randoms अब है कि के साथ एक वस्तु लग रहा है जैसे:

head(randoms) 
groupFctr groupID  term  mean  median  sd 
1 Subject  308 (Intercept) 3.083375 2.214805 14.79050 
2 Subject  309 (Intercept) -39.382557 -38.607697 12.68987 
3 Subject  310 (Intercept) -37.314979 -38.107747 12.53729 
4 Subject  330 (Intercept) 22.234687 21.048882 11.51082 
5 Subject  331 (Intercept) 21.418040 21.122913 13.17926 
6 Subject  332 (Intercept) 11.371621 12.238580 12.65172 

यह समूहीकरण कारक के नाम प्रदान करता है, कारक हम के लिए एक अनुमान प्राप्त कर रहे हैं के स्तर पर, मॉडल में अवधि , और नकली मूल्यों का माध्य, औसत, और मानक विचलन। हम इस का उपयोग कर सकते ऊपर वाले के समान एक कैटरपिलर साजिश उत्पन्न करने के लिए:

plotREsim(randoms) 

कौन सा पैदा करता है:

A caterpillar plot of random effects

एक अच्छा फीचर है कि मूल्यों एक विश्वास अंतराल है कि शून्य ओवरलैप नहीं करता है काले रंग में हाइलाइट किया गया है। आप level पैरामीटर plotREsim पर अपनी आवश्यकताओं के आधार पर व्यापक या संकुचित आत्मविश्वास अंतराल बनाने के द्वारा अंतराल की चौड़ाई को संशोधित कर सकते हैं।

संबंधित मुद्दे