2013-04-26 7 views
5

Kiedy masz wielopoziomowy model z dużą ilością czynników i interakcji, rozmiar korelacji stałej matrycy efektów może stać się dość duży i niejasne.Jak wyodrębnić korelację stałych efektów część lmer output

mogę użyć parametru symbolic.cor=T w metodzie druku, aby jaśniejszy druk streszczenia jak poniżej:

ratbrain <- 
within(read.delim("http://www-personal.umich.edu/~bwest/rat_brain.dat"), 
{ 
treatment <- factor(treatment, 
labels = c("Basal", "Carbachol")) 
region <- factor(region, 
labels = c("BST", "LS", "VDB")) 
}) 

print(mod<-lmer(activate ~ region * treatment + (0 + treatment | animal),ratbrain),symbolic.cor=T) 

Ten działki nieco jaśniejszy macierzy korelacji dla dużych matrycach. Chociaż matryca tego przykładu nie jest tak duża. Ale byłoby miło, gdybym mógł narysować mapę cieplną korelacji.
Jak wyodrębnić korelację ustalonych efektów, aby utworzyć mapę termiczną?

EDIT:

Oto funkcja stworzyłem dzięki odpowiedzi.

fixeff.plotcorr<-function(mod,...) 
{ 
    #require(GGally) # contains another correlation plot using ggplot2 
    require(lme4) 

    fixNames<-names(fixef(mod)) 

    # Simon O'Hanlon's answer: 
    # so <- summary(mod) 
    # df<-as.matrix([email protected]@factors$correlation) for version lme4<1.0 
    # df<-as.matrix([email protected]$correlation) # lme4 >= 1.0 

    df<-as.matrix(cov2cor(vcov(mod))) #Ben Bolker's solution 

    rownames(df)<-fixNames 
    colnames(df)<-abbreviate(fixNames, minlength = 11) 

    colsc=c(rgb(241, 54, 23, maxColorValue=255), 'white', rgb(0, 61, 104, maxColorValue=255)) 
    colramp = colorRampPalette(colsc, space='Lab') 
    colors = colramp(100) 
    cols=colors[((df + 1)/2) * 100] 
    # I'm using function my.plotcorr which you can download here: 
    # http://hlplab.wordpress.com/2012/03/20/correlation-plot-matrices-using-the-ellipse-library/ 
    my.plotcorr(df, col=cols, diag='none', upper.panel="number", mar=c(0,0.1,0,0),...) 

    # Another possibility is the corrplot package: 
    # cols <- colorRampPalette(c("#67001F", "#B2182B", "#D6604D", "#F4A582", "#FDDBC7", 
    #        "#FFFFFF", "#D1E5F0", "#92C5DE", "#4393C3", "#2166AC", "#053061")) 
    # require(corrplot,quiet=T) 
    # corrplot(df, type="upper", method="number", tl.pos='tl', tl.col='black', tl.cex=0.8, cl.pos='n', col=cols(50)) 
    # corrplot(df,add=TRUE, method='ellipse', type='lower', tl.pos='n', tl.col='black', cl.pos='n', col=cols(50), diag=FALSE) 
} 

Musisz pobrać funkcję my.plotcorr z here. Uzyskany wykres powyższym przykładzie za pomocą komendy fixeff.plotcorr(mod) teraz wygląda tak: enter image description here

Odpowiedz

4

Stosując metodę S4 funkcję aukcji możemy wrócić funkcji, które jest wywoływane, gdy print nazywany jest na obiekt klasy "mer":

selectMethod(print , "mer") 

Patrząc na kod źródłowy, który jest zwracany możemy znaleźć linie mające zastosowanie do ciebie:

if (correlation) { 
      corF <- [email protected]@factors$correlation 

so jest definiowana jako podsumowanie Twojego obiektu, więc w danym przypadku należy po prostu trzeba wyodrębnić:

so <- summary(mod) 
[email protected]@factors$correlation 
5

nie wiem metody bezpośredniej. Ale to jest obejście problemu.

diag(diag(1/sqrt(vcov(mod)))) %*% vcov(mod) %*% diag(diag(1/sqrt(vcov(mod)))) 
+1

+1 za to, co uważam za obejście, ale matematyczne wyprowadzenie korelacji z macierzy v-cov !! :-) –

5

Jak na temat korzystania z wbudowanego

cov2cor(vcov(mod)) 

?

+0

Nice One! Nie znałem tej funkcji. – Robert

Powiązane problemy