从R中的lavaan列表矩阵中提取残差值

时间:2015-05-17 14:28:13

标签: r r-lavaan

我正在使用lavaan包,我的目的是将我的模型残差作为数据帧以供进一步使用。我运行了几个具有分组变量的模型。这是基本的工作流程:

require(lavaan)
df <- data.frame(
        y1 = sample(1:100),
        y2 = sample(1:100),
        x1 = sample(1:100),
        x2 = sample(1:100),
        x3 = sample(1:100),
        grpvar = sample(c("grp1","grp2"), 100, replace = T))
semModel <- list(length = 2)
semModel[1] <- 'y1 ~ c(a,b)*x1 + c(a,b)*x2'
semModel[2] <- 'y1 ~ c(a,b)*x1 
                y2 ~ c(a,b)*x2 + c(a,b)*x3'
funEstim <- function(model){
    sem(model, data = df, group = "grpvar", estimator = "MLM")}
fits <- lapply(semModel, funEstim)
residuals <- lapply(fits, function(x) resid(x, "obs"))

现在生成的残差对象会让我感到烦恼。它是嵌套几次的矩阵列表。如何在不进行任何硬编码的情况下将每个矩阵作为单独的数据帧?我不想取消他们,因为这会丢失一些信息。

1 个答案:

答案 0 :(得分:1)

您可以list2envunlist一起使grp1grp2length.grp1length.grp2直接在全球范围内使用环境。

list2env(unlist(residuals, recursive=FALSE), envir=.GlobalEnv)
ls()
#[1] "df"          "fits"        "funEstim"    "grp1"        "grp2"       
#[6] "length.grp1" "length.grp2" "residuals"   "semModel"

但它们不是数据框架。为此,您可以在调用list2env之前将它们转换为数据框:

df.list <- lapply(unlist(residuals, recursive=FALSE), data.frame)
list2env(df.list, envir=.GlobalEnv)