问题
Below I was wondering if there might be a way to extract the columns Name and Groups from vc1 and vc2 and respectively paste them as the column names for objects AA, BB.
For example, for MODEL 1 (below), my expected output of AA will be:
                    plate_(Intercept) #: Name & Groups column from `vc1`
Standard deviation     1.54
Proportion of Variance 1.00
Cumulative Proportion  1.00
                   sample_(Intercept) #: Name & Groups column from `vc1`
Standard deviation     3.513
Proportion of Variance 1.000
Cumulative Proportion  1.000
Is this achievable in R (possibly as a function)?
library(lme4)
## MODEL 1:
fm1 <- lmer(diameter ~ 1 + (1|plate) + (1|sample), Penicillin)
(vc1 <- VarCorr(fm1))
AA <- summary(rePCA(fm1))
## MODEL 2:
fm2 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
(vc2 <- VarCorr(fm2))
BB <- summary(rePCA(fm2))
回答1:
We can write a function :
return_names <- function(obj, model) {
  Map(function(x, z) {
    colnames(x$importance) <- paste(z,unique(sapply(model, colnames)), sep = '_')
    x
  }, obj, names(obj))
}
return_names(AA, vc1)
#$plate
#Importance of components:
#                       plate_(Intercept)
#Standard deviation                  1.54
#Proportion of Variance              1.00
#Cumulative Proportion               1.00
#$sample
#Importance of components:
#                       sample_(Intercept)
#Standard deviation                  3.513
#Proportion of Variance              1.000
#Cumulative Proportion               1.000
return_names(BB, vc2)
#$Subject
#Importance of components:
#                       Subject_(Intercept) Subject_Days
#Standard deviation                  0.9669      0.23088
#Proportion of Variance              0.9460      0.05395
#Cumulative Proportion               0.9460      1.00000
回答2:
The summary of rePCA produces a list.  You can iterate over the names of that list, draw the (unique) relevant labels from vc1/vc2, and assign those labels as colnames.
Note that the data frame inside each element of rePCA is accessed through the $importance attribute.
This can be wrapped as a function:
set_importance_colnames <- function(vc, pca_data) {
  for (name in names(pca_data)) {
    vc_df <- as.data.frame(vc)
    target <- vc_df[vc_df$grp == name, ]
    new_label <- unique(paste(target$grp, target$var1, sep = "_"))
    colnames(pca_data[[name]]$importance) <- new_label
  }
  return(pca_data)
}
Output for AA:
set_importance_colnames(vc1, AA)
$plate
Importance of components:
                       plate_(Intercept)
Standard deviation                  1.54
Proportion of Variance              1.00
Cumulative Proportion               1.00
$sample
Importance of components:
                       sample_(Intercept)
Standard deviation                  3.513
Proportion of Variance              1.000
Cumulative Proportion               1.000
Output for BB:
set_importance_colnames(vc2, BB)
$Subject
Importance of components:
                       Subject_(Intercept) Subject_Days
Standard deviation                  0.9669      0.23088
Proportion of Variance              0.9460      0.05395
Cumulative Proportion               0.9460      1.00000
来源:https://stackoverflow.com/questions/64095188/extracting-names-from-a-varcorr-object-in-lme4-and-pasting-it-as-column-names