L oop или функция в R для многократного анализа с похожими переменными - PullRequest
0 голосов
/ 29 марта 2020

Относительно плохо знаком с , и я пытаюсь выяснить, как выполнить идентичный анализ для двух разных наборов переменных. Это не мои данные, но вот как выглядит мой код прямо сейчас:

library(lavaan)
names(PoliticalDemocracy)

listoftype <- c("x", "y") 

anexample <- function(tst) {
  model <- '
     tst3 ~ 
          + tst1 
          + tst2
'

  runmodel <- lavaan::sem(model, 
                                        data = PoliticalDemocracy,
                                        missing = "default",
                                        estimator = "ML",
                                        se = "default",
  )
  lavaan::summary(runmodel, fit.measures=FALSE)
  modelsummary <-lavaan::summary(runmodel, fit.measures=FALSE)
  write(paste(utils::capture.output(summary(runmodel)),
              collapse = "\n"), file = paste0("output_",tst.txt))
  tst <-as.data.frame(modelsummary)

}

lapply(listoftype, FUN = anexample)

Вы, вероятно, можете понять, что я пытаюсь сделать, но основная идея c в том, что я пытаясь запустить первый анализ с x3, x2 и x1, а затем второй с y3, y2 и y1. Я пытаюсь вставить либо «х» или «у», где у меня есть «тст». Я также пытался сделать это с помощью al oop (это то, что я бы использовал в других статистических пакетах), но это тоже не сработало, и я понимаю, что будет работать лучше для этой цели, если Я мог бы когда-нибудь понять это.

Пока что я получаю сообщение об ошибке:

lavaan ОШИБКА: отсутствуют наблюдаемые переменные в наборе данных: tst3 tst1 tst2

Так ясно, что R не распознает, что он должен вставить «x» или «y», где находится «tst». У кого-нибудь есть предложения о том, как заставить это работать? Спасибо.

1 Ответ

1 голос
/ 29 марта 2020

Проблема в вашем случае заключается в том, что вы на самом деле не заменяете x или y на tst. См., Например,

library(stringr)

anexample <- function(tst) {
  model <- 'tst3 ~ + tst1 + tst2'
  model <- str_replace_all(model, 'tst', tst)
  return(model)
  }

lapply(listoftype, FUN = anexample)
[[1]]
[1] "x3 ~ + x1 + x2"

[[2]]
[1] "y3 ~ + y1 + y2"

Итак, должно работать следующее:

anexample <- function(tst) {
  model <- 'tst3 ~ + tst1 + tst2'
  model <- str_replace_all(model, 'tst', tst)

  runmodel <- lavaan::sem(model, 
                          data = PoliticalDemocracy,
                          missing = "default",
                          estimator = "ML",
                          se = "default",
  )
  lavaan::summary(runmodel, fit.measures=FALSE)
  modelsummary <-lavaan::summary(runmodel, fit.measures=FALSE)
  write(paste(utils::capture.output(summary(runmodel)),
              collapse = "\n"), file = paste0("output_",tst, '.txt'))
  tst <-as.data.frame(modelsummary)

}

lapply(listoftype, FUN = anexample)

Чтобы получить результаты с соответствующим именем, взгляните на следующее в качестве примера:

anexample <- function(tst) {
  model <- str_replace_all('tst3 ~ + tst1 + tst2', 'tst', tst)
  runmodel <- lavaan::sem(model, 
                          data = PoliticalDemocracy,
                          missing = "default",
                          estimator = "ML",
                          se = "default",
  )
  modelsummary <-lavaan::summary(runmodel, fit.measures=FALSE)
  return(as.data.frame(modelsummary))
}

output <- setNames(lapply(listoftype, anexample), listoftype)
str(output)
List of 2
 $ x:'data.frame':  6 obs. of  8 variables:
  ..$ PE.lhs   : chr [1:6] "x3" "x3" "x3" "x1" ...
  ..$ PE.op    : chr [1:6] "~" "~" "~~" "~~" ...
... 
 $ y:'data.frame':  6 obs. of  8 variables:
  ..$ PE.lhs   : chr [1:6] "y3" "y3" "y3" "y1" ...
  ..$ PE.op    : chr [1:6] "~" "~" "~~" "~~" ...
...

Это дает вам список с x и y. Чтобы «переместить» это в глобальную среду, вы можете дополнительно использовать list2env(output, globalenv()).

...