私は lm-syntax を lavaan に翻訳することに興味があります。特に、因子のレベル数が 2 を超える場合に、因子 x 数値変数間のエフェクト コード化された相互作用を調べています。(注意:エフェクト コーディングは、コードが -1、1、および 0 になるようにカテゴリ変数をダミー コーディングする代わりの方法です。)
以下に最小限の例を示します (無意味です)。lm (線形回帰) 構文と、対応する lavaan 構文 (回帰部分) が表示されます。相互作用のない回帰では機能しますが、相互作用では機能しません。
最初に、効果がコード化された因子を使用した交互作用のない回帰を考えます。
これは機能します
library(lavaan)
# Use iris data as minimal example
#
# 1. Linear regression model
# Change contrasts to effects-coding
contrasts(iris$Species) <- contr.sum(3)
# Linear regression
lmmodel <- Sepal.Length ~ Species # the regression model
lmfit <- lm(lmmodel, iris) # fit it
# 2. SEM
# first, re-code the factors
iris$s1 <- contrasts(iris$Species)[iris$Species, 1] # Numeric and effects-coed
iris$s2 <- contrasts(iris$Species)[iris$Species, 2] # - " -
semmodel <- 'Sepal.Length ~ s1 + s2' # the SEM model
semfit <- sem(semmodel, iris) # fit it
# 3. Compare the coefficients lm vs. sem, should be equal (and are equal)
cbind(coef(lmfit)[-1], coef(semfit)[-length(coef(semfit))])
# [,1] [,2]
# Species1 -0.83733333 -0.83733330
# Species2 0.09266667 0.09266664
インタラクションでそれを行う方法は次の とおりです。どこが間違っていますか?
# 1. Linear regression w/ interaction
lmmodel <- Sepal.Length ~ Species + Species:Sepal.Width
lmfit <- lm(lmmodel, iris)
# 2. SEM
iris$s3 <- as.numeric(iris$Species=='virginica') # Code third species
iris$s1_w <- iris$s1 * iris$Sepal.Width # Numeric interaction
iris$s2_w <- iris$s2 * iris$Sepal.Width # - " -
iris$s3_w <- iris$s3 * iris$Sepal.Width # - " -"
semmodel <- 'Sepal.Length ~ s1 + s2 + s1_w + s2_w + s3_w'
semfit <- sem(semmodel, iris)
# 3. Compare the coefficients lm vs. sem
cbind(coef(lmfit)[-1], coef(semfit)[-length(coef(semfit))])
# [,1] [,2]
# Species1 -0.7228562 -0.7228566
# Species2 0.1778772 0.1778772
# Speciessetosa:Sepal.Width 0.6904897 0.6904899
# Speciesversicolor:Sepal.Width 0.8650777 0.8650779 <----- equal
# Speciesvirginica:Sepal.Width 0.9015345 2.4571023 <----- not equal