How do I extract the Correlation of fixed effects part of the lmer output

核能气质少年 提交于 2019-12-18 16:58:18

问题


When you have a multilevel model with lots of factors and interactions the size of the correlation of fixed effects matrix can become quite big and unclear.

I can use the symbolic.cor=T parameter in the print method to make a clearer print of the summary like below:

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)

This plots a somewhat clearer correlation matrix for large matrices. Allthough this example's matrix isn't so big. But it would be nice if I could plot a heatmap of the correlations.
How do I extract the correlation of fixed effects so I can make this heatmap?

EDIT:

Here's the function I created thanks to the answers.

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(so@vcov@factors$correlation) for version lme4<1.0
  # df<-as.matrix(so$vcov@factors$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)
}

You have to download the my.plotcorr function from here. The resulting plot of the example above using command fixeff.plotcorr(mod) now looks like this:


回答1:


Using the S4 method listing function we can return the function which is dispatched when print is called on an object of class "mer":

selectMethod( print , "mer" )

Looking at the source code that is returned we can find the lines applicable to you:

if (correlation) {
            corF <- so@vcov@factors$correlation

so is defined as the summary of your object, so in your case you should just need to extract:

so <- summary(mod)
so@vcov@factors$correlation



回答2:


How about using the built-in

cov2cor(vcov(mod))

?




回答3:


I don't know direct method. But this is workaround.

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


来源:https://stackoverflow.com/questions/16233709/how-do-i-extract-the-correlation-of-fixed-effects-part-of-the-lmer-output

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!