Синтаксис модели для простой модели модерации в Lavaan (с начальной загрузкой)

Я социолог, в настоящее время использую простую модель модерации в R в форме y ~ x + m + m * x. Мой модератор - это бинарная категориальная переменная (две отдельные группы).

Я начал с lm (), загрузил оценки с помощью boot () и получил доверительные интервалы bca с помощью boot.ci. Поскольку не существует автоматического способа сделать это для всех параметров (по крайней мере, на моем уровне кодирования), это немного утомительно. Однако теперь я увидел, что пакет lavaan предлагает начальную загрузку как часть обычной функции sem(), а также CI bca как часть parameterEstimates(). Итак, мне было интересно (поскольку я использую лаву в других анализах), могу ли я просто заменить lm () на лаву, чтобы моя работа была более согласованной.

Делая это, я задавался вопросом, какой будет эквивалентная модель для лавы, чтобы таким же образом протестировать на модерацию. Я видел этот пост, где Джереми Майлз предлагает приведенный ниже код, который я следуют в основном.

mod.1 <- "
 y ~ c(a, b) * x
 y ~~ c(v1, v1) * y  # This step needed for exact equivalence
 y ~ c(int1, int2) * 1
 modEff := a - b
 mEff := int1 - int2"

Но было бы здорово, если бы вы помогли мне разобраться в некоторых последних вещах.

1) Что означает часть y ~~ c(v1, v1) * y и зачем она нужна для «точной эквивалентности» модели lm? Судя по выходным данным, дисперсия результата для обеих групп сводится к одному и тому же значению?

2) Правильно ли я понимаю из сообщения, что включение эффекта взаимодействия, рассчитанного выше, ИЛИ ограничение (только) наклона между моделями и рассмотрение модели, подходящей для anova(), будет таким же тестом на модерацию?

3) На странице лавы говорится, что добавление test = "bootstrap" к функции sem() позволяет настраивать ускорение p -ценности. Тем не менее, я много читал о p-значениях, иногда конфликтующих с bca-CI, и это случилось со мной. Осмотревшись, я понимаю, что этот конфликт исходит из предположений о распределении данных под H0 для p-значений, но не для CI (которые просто дают диапазон наиболее вероятных значений). Поэтому мне было интересно, что именно означает, что приведенные здесь p-значения "скорректированы с учетом начальной загрузки"? Является ли технически более верным сообщать об этом для моих моделей SEM, чем для CI?

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

Лучший,

Алекс


person AleKir    schedule 07.06.2020    source источник


Ответы (1)


Думаю, что смогу ответить хотя бы Nr. 1 и 2 ваших вопросов, но, вероятно, проще не использовать SEM и вместо этого запрограммировать функцию, которая удобно дает вам CI для всех коэффициентов вашей модели.

Итак, сначала, чтобы ответить на ваши вопросы:

  1. То, что предлагается в приведенном вами коде, называется сравнением нескольких групп. По сути, это означает, что вы подходите к одному и тому же SEM для двух разных групп наблюдений в вашем наборе данных. Это эквивалентно умеренной регрессии с бинарным модератором, потому что в обоих случаях вы получаете два наклона (часто называемые «простыми наклонами») для скалярного предиктора, по одному наклону на группу модератора.
    Теперь , в вашем коде лавы вы видите только скалярный предсказатель x. Бинарный модератор подразумевается group="m", когда вы подходите к модели с fit.1 <- sem(mod.1, data = df, group = "m") (взято со страницы, на которую вы ссылаетесь).
    Двухэлементные векторы (c( , )) в коде лавы определяют именованные параметры для первой и второй группы, соответственно . По y ~~ c(v1, v1) * y, остаточные дисперсии y устанавливаются равными в обеих группах, потому что они имеют одно и то же имя. Напротив, наклоны c(a, b) и точки пересечения c(int1, int2) могут варьироваться между группами.
  2. да. Если вы используете SEM, вы бы поместили модель во второй раз, добавив a == b, и сравните эту модель с первой версией, где уклоны могут отличаться. Это то же самое, что и сравнение lm() моделей с и без a:b (или a*b) в формуле.
  3. Здесь я не могу дать прямого ответа на ваш вопрос. Я подозреваю, что если вам нужны BCa CI, как если бы вы применили boot.ci к lm модели, это может не быть реализовано. В документации по lavaan BCa доверительные интервалы упоминаются только один раз: В разделе о функции parameterEstimates, которая также может выполнять загрузку (см. Стр. 89). Тем не менее, он не производит фактических BCa (скорректированных на смещение и ускоренных) CI, а только с поправками на смещение.

Как упоминалось выше, я полагаю, что самым простым решением было бы использовать lm() и либо повторить процедуру boot.ci для каждого коэффициента, либо написать функцию-оболочку, которая сделает это за вас. Я предлагаю это еще и потому, что рецензент может быть весьма озадачен, увидев, что вы выполняете многогрупповой SEM вместо простой модерируемой регрессии, которая встречается гораздо чаще.

Вы, наверное, уже делали что-то подобное:

lm_fit <- function(dat, idx) coef( lm(y ~ x*m, data=dat[idx, ]) )
bs_out <- boot::boot(mydata, statistic=lm_fit, R=1000)
ci_out <- boot::boot.ci(bs_out, conf=.95, type="bca", index=1)

Теперь либо вы повторяете последнюю строку для каждого коэффициента, т. Е. Меняя index от 1 до 4. Или вы начинаете фантазировать и позволяете R повторить это с помощью такой функции:

all_ci <- function(bs) {
  est <- bs$t0
  lower <- vector("numeric", length(bs$t0))
  upper <- lower
  for (i in 1:length(bs$t0)) {
    ci <- tail(boot::boot.ci(bs, type="bca", index=i)$bca[1,], 2)
    lower[i] <- ci[1]
    upper[i] <- ci[2]
  }
  cbind(est, lower, upper)
}

all_ci(bs_out)

Я уверен, что это можно было бы написать более кратко, но он должен нормально работать для начальной загрузки простых lm() моделей.

person benimwolfspelz    schedule 10.06.2020