【问题标题】:How can I extract one specific coefficient from multiple lavaan models?如何从多个 lavaan 模型中提取一个特定系数?
【发布时间】:2021-01-28 10:15:10
【问题描述】:

我编写了一个函数来一次运行多个 lavaan 模型(来自 5 个不同的数据集)。在输出中,我得到 5 个不同的输出。但是,我想从这些模型中的每一个中提取一个特定的估计值,因为我在元分析中使用它们(而且我还有更多模型)

这是我运行模型的代码:

df_list <- list ('Y1'=emo_dyn_1,'Y2'=emo_dyn_2,'Y3'=emo_dyn_3,'Y4'=emo_dyn_4,'Y5'=emo_dyn_5)

model <- 'DepB ~ isdNA + imeanNA + sex + age'

fun = function(emo_dyn){
  fit=sem(model,
          data=emo_dyn,
          estimator = "MLR", 
          missing = "ml.x")
  summ = summary(fit, standardized = TRUE)
  
  list(fit = fit,summary = summ)
  
}

results <- lapply(df_list,fun)
names(results) <- names(df_list)
results

这就是我提取系数的方法。它有点使它成为一个数据框,然后我从中提取特定值。不确定这是否是最佳选择。它是关于特定路径的标准化估计。但它只是复制和粘贴,我相信这会更容易,但我不知道如何编写这个循环。

emo_dyn_1_est<-standardizedSolution(results$Y1$fit) # Standardised coefficients
emo_dyn_1_est_1<-emo_dyn_1_est[1, 4]
emo_dyn_1_est_1

emo_dyn_2_est<-standardizedSolution(results$Y2$fit) # Standardised coefficients
emo_dyn_2_est_2<-emo_dyn_2_est[1, 4]
emo_dyn_2_est_2

emo_dyn_3_est<-standardizedSolution(results$Y3$fit) # Standardised coefficients
emo_dyn_3_est_3<-emo_dyn_3_est[1, 4]
emo_dyn_3_est_3

emo_dyn_4_est<-standardizedSolution(results$Y4$fit) # Standardised coefficients
emo_dyn_4_est_4<-emo_dyn_4_est[1, 4]
emo_dyn_4_est_4

emo_dyn_5_est<-standardizedSolution(results$Y5$fit) # Standardised coefficients
emo_dyn_5_est_5<-emo_dyn_5_est[1, 4]
emo_dyn_5_est_5

【问题讨论】:

  • 嗨,Dominique,欢迎 :) 我不太明白你在问什么。您似乎已经能够访问系数,缺少什么?
  • 嗨,我确实访问了估算值,是的。但是有没有办法写一个循环什么的,因为现在我复制和粘贴所有的东西 5 次。

标签: r loops parameters extract r-lavaan


【解决方案1】:

lavaan 具有 parameterEstimates 功能,因此您可以执行以下操作:

df_list <- list ('Y1'=emo_dyn_1,'Y2'=emo_dyn_2,'Y3'=emo_dyn_3,'Y4'=emo_dyn_4,'Y5'=emo_dyn_5)

model <- 'DepB ~ isdNA + imeanNA + sex + age'

fun <- function(emo_dyn){
  fit <- sem(model,
          data=emo_dyn,
          estimator = "MLR", 
          missing = "ml.x")
  
  fit
}

results <- lapply(df_list,fun)
names(results) <- names(df_list)

## Get a specific parameter
get_param <- function(fit, coef_pos) {
    param <- parameterEstimates(fit, standardized = TRUE)[coef_pos, "std.lv"]
    param
}

lapply(results, get_param, coef_pos = 1)

我做了一项更改:在您的 lapply 中获得结果,我只保持模型适合。如果你想要所有的总结,你可以做lapply(results, summary)get_param 函数假定您知道所需参数在结果表中的位置。

如果您想保留现有的lapply 以获得结果,那么这样的方法会起作用:

results_fit_only <- lapply(results, "[[", "fit")
lapply(results_fit_only, get_param, coef_pos = 1)

【讨论】:

  • 您好,非常感谢!在lapply(results, get_param, coef_pos = 1) 中,出现错误。你说我需要知道参数在哪里。你知道我是怎么发现的吗?因为现在我收到错误Error in parameterEstimates(fit, standardized = TRUE) : trying to get slot "Options" from an object of a basic class ("list") with no slots
  • 好的,抱歉,你的最后一个代码成功了,你为我节省了很多工作!
  • 干杯!至于您遇到的错误,parameterEstimates 需要直接拟合模型。由于您将模型拟合和摘要存储在结果中,因此您需要先提取拟合对象或修改模型估计函数以仅返回模型拟合。
猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 2022-06-25
  • 2016-11-23
  • 2019-02-17
  • 2016-07-25
  • 2018-12-03
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多