Зацикливание комбинаций имен столбцов с синтаксисом лавы - PullRequest
0 голосов
/ 25 февраля 2019

Как зациклить строки фрейма данных, содержащие перестановки имен переменных, при выполнении анализа посредничества с lavaan?

Скажем, у меня есть 4 переменные var1, var2, var3,var4:

df<- data.frame(var1 = rnorm(100), 
                var2 = rnorm(100), 
                var3 = rnorm(100),
                var4 = rnorm(100))

Использование gtools::permutations() Я сохраняю все возможные перестановки 4 переменных в наборах по 3:

permut <- 
  gtools::permutations(n = 4, r = 3, v = names(df), repeats.allowed = FALSE)

colnames(permut) <- c("Y", "X", "M")

> head(permut)
     Y      X      M     
[1,] "var1" "var2" "var3"
[2,] "var1" "var2" "var4"
[3,] "var1" "var3" "var2"
[4,] "var1" "var3" "var4"
[5,] "var1" "var4" "var2"
[6,] "var1" "var4" "var3"

Затем я устанавливаю модель медитации, используя lavaanсинтаксис, где меня интересует опосредованное влияние M на отношения между X и Y:

mod <- "
    M ~ a * X
    Y ~ c * X + b * M
    ind := a*b
    tot := c + (a*b)
    "

Я хочу запустить модель и сохранить ее результаты для будущей проверки:

library(lavaan)
library(dplyr)

#fit the model
fit <- sem(mod, df, se = "robust")

#save results
result <-
parameterestimates(fit) %>% filter(op != "~~")

Мой вопрос здесь такой:

Как указать R использовать в качестве Y,X,M имена переменных из каждой строки permut, соответствовать моделииспользовать данные из df и синтаксис модели из mod и в конечном итоге сохранять результаты для каждой подгонки модели?

Приведенный выше код является простейшим из возможных сценариев, который я хотел бы использовать для запуска более сложных моделей.способ.

Мне известны ответы о циклической строкеar модели различных переменных: цикл по всем возможным комбинациям , цикл по комбинациям терминов регрессионной модели , Цикл линейной регрессии для каждой независимой переменной индивидуально для зависимых , ивозможно, ближайший: Как использовать ссылочные переменные по символьной строке в формуле? , но все же я застрял и не смог решить эту проблему в выходные дни.

1 Ответ

0 голосов
/ 25 февраля 2019

Вот один из способов сделать это:

fits <- apply(permut, 1, function (p) {
    permuted.df <- df[p]
    colnames(permuted.df) <- names(p)
    sem(mod, permuted.df, se="robust")
})

fits содержит результаты SEM для каждой 3-подстановки в permut.Чтобы увидеть оценки, например, первого подбора, вы можете продолжить как обычно:

> parameterestimates(fits[[1]]) %>% filter(op != "~~")
  lhs op     rhs label         est         se          z     pvalue    ci.lower
1   M  ~       X     a -0.18393765 0.10977670 -1.6755618 0.09382406 -0.39909603
2   Y  ~       X     c  0.07314372 0.09891034  0.7394952 0.45960637 -0.12071699
3   Y  ~       M     b  0.01944518 0.08852450  0.2196587 0.82613697 -0.15405965
4 ind :=     a*b   ind -0.00357670 0.01600038 -0.2235385 0.82311644 -0.03493686
5 tot := c+(a*b)   tot  0.06956702 0.09816192  0.7086966 0.47851276 -0.12282680
    ci.upper
1 0.03122074
2 0.26700443
3 0.19295001
4 0.02778346
5 0.26196084
...