Как я могу извлечь один конкретный коэффициент из нескольких моделей лавы?

Я написал функцию для одновременного запуска нескольких моделей лавы (из 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

person Dominique Maciejewski    schedule 28.01.2021    source источник
comment
Привет, Доминик, добро пожаловать :) Я не совсем понимаю, о чем вы спрашиваете. Кажется, вы уже можете получить доступ к коэффициентам, чего не хватает?   -  person WurmD    schedule 28.01.2021
comment
Привет, у меня есть доступ к оценкам, да. Но есть ли способ написать цикл или что-то в этом роде, потому что теперь я копирую и вставляю все 5 раз.   -  person Dominique Maciejewski    schedule 28.01.2021


Ответы (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)
person rps1227    schedule 28.01.2021
comment
Привет, большое спасибо! в 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 - person Dominique Maciejewski; 28.01.2021
comment
Хорошо, извините, ваш последний код сработал. Вы сэкономили мне ТАКОЕ много работы! - person Dominique Maciejewski; 28.01.2021
comment
Ваше здоровье! Что касается вашей ошибки, parameterEstimates нужна прямая подгонка модели. Поскольку вы сохраняете соответствие модели и сводку в своих результатах, вам необходимо сначала извлечь подходящий объект или изменить свою функцию для оценки модели, чтобы она возвращала только соответствие модели. - person rps1227; 28.01.2021