في R ، رسم مؤثرات عشوائية من lmer(حزمة lme4) باستخدام qqmath أو dotplot: كيفية جعلها تبدو خيالية؟




ggplot2 random-effects (2)

أحد الاحتمالات هو استخدام ggplot2 للمكتبة لرسم رسم بياني مماثل ومن ثم يمكنك ضبط مظهر مؤامرة.

أولا ، يتم حفظ كائن randoms كما randoms . ثم يتم حفظ تباينات من intercept في الكائن qq .

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

يحتوي الكائن rand.interc على اعتراض عشوائي مع أسماء المستوى.

rand.interc<-randoms$Batch

جميع الكائنات وضعت في إطار بيانات واحد. لفترات خطأ يتم حساب sd.interc كجذر مربع مرتين من التباين.

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

إذا كنت بحاجة إلى أن يتم lev.names أوامر اعتراض في مؤامرة وفقا لقيمة ثم ينبغي إعادة ترتيب 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)

وظيفة qqmath يجعل مؤامرات كاتربيلر كبيرة من الآثار العشوائية باستخدام الإخراج من حزمة lmer. وهذا هو ، qqmath عظيم في التآمر على اعتراضات من نموذج هرمي مع أخطائهم حول تقدير نقطة. يوجد مثال على وظائف lmer و qqmath أدناه باستخدام البيانات المضمنة في الحزمة lme4 المسماة Dyestuff. سينتج الكود نموذجًا هرميًا ومؤامرة لطيفة باستخدام وظيفة ggmath.

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 أعلاه وإضافة بعض الخيارات ، مثل ، جعل نقاط معينة فارغة مقابل ممتلئة ، أو ألوان مختلفة لنقاط مختلفة؟ على سبيل المثال ، هل يمكنك أن تجعل نقاط A و B و C من متغير Batch معبأ ، ولكن بقية النقاط فارغة؟
  2. هل من الممكن إضافة تسميات محور لكل نقطة (ربما على طول المحور الصادي أو الأيمن على سبيل المثال)؟
  3. بياناتي تقترب من 45 اعتراضًا ، لذا من الممكن إضافة المسافات بين العلامات بحيث لا تتداخل مع بعضها البعض؟ بشكل رئيسي ، أنا مهتم بالتمييز / التمييز بين النقاط على الرسم البياني ، والذي يبدو مرهقاً / مستحيلاً في وظيفة ggmath.

حتى الآن ، فإن إضافة أي خيار إضافي في وظيفة qqmath ينتج أخطاء حيث لن أواجه أخطاء إذا كانت مؤامرة قياسية ، لذلك فأنا في حيرة.

أيضا ، إذا كنت تشعر أن هناك حزمة / وظيفة أفضل لتآمر اعتراضات من المخرج ، أود أن أسمع ذلك! (على سبيل المثال ، يمكنك أن تفعل النقاط 1-3 باستخدام dotplot؟)

شكر.

تحرير: أنا أيضاً مفتوحة dotplot بديلة إذا كان يمكن تنسيقها بشكل معقول. أنا فقط أحب أن ننظر إلى مؤامرة ggmath ، لذلك أنا بدأت مع سؤال حول ذلك.


إجابة ديدز رائعة! فقط للفه قليلا ، وأنا وضعت في وظيفتها التي تتصرف كثيرا مثل qqmath.ranef.mer() و dotplot.ranef.mer() . بالإضافة إلى إجابة Didzis ، فإنها تتعامل أيضًا مع نماذج ذات تأثيرات عشوائية متعددة مرتبطة (مثل qqmath() و dotplot() ). مقارنة مع qqmath() :

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

مقارنة مع dotplot() :

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

في بعض الأحيان ، قد يكون من المفيد وجود مقاييس مختلفة للتأثيرات العشوائية - وهو أمر dotplot() . عندما حاولت الاسترخاء ، اضطررت لتغيير المواجهة (انظر هذه answer ).

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

## 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)
}






random-effects