2015-05-17 108 views
0

我正在使用lavaan軟件包,我的意圖是將我的模型殘差作爲數據框用於進一步的使用。我運行了幾個有分組變量的模型。這裏的基本工作流程:從R 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")) 

現在由此產生的殘差對象錯誤我。它是嵌套幾次的矩陣列表。如何在沒有任何硬編碼的情況下將每個矩陣作爲單獨的數據框?我不想將它們取消,因爲這會丟失一些信息。

+2

看起來你有靠近你的代碼的末尾編輯/複製/粘貼錯誤 - 該功能沒有一個右括號。另外,你的意思是「沒有任何硬編碼」? –

+0

你說得對。我現在解決了。 – Antti

回答

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) 
+1

這起作用。但是,我發現我從lavaan Google羣組獲得的解決方案更加方便。 lapply(residuals,function(x){lapply(x,data.frame)}就是這樣做的。 – Antti