井出草平の研究ノート

Guttmanのラムダ係数のRにおける実装

理論はこちら

ides.hatenablog.com

昔はLambda4というパッケージがあったようだが、今はアーカイブに入っていて、使えない。

github.com

現在のパッケージの中では、psychパッケージを使ってλ1~λ6を計算する方法をするのが最もよい。

Readme
https://cran.r-project.org/web/packages/psych/refman/psych.html#alpha

ライブラリの読み込みとデータ準備

library(psych)

# bfi から外向性(E1〜E5)の5項目を使用
data(bfi)
X <- bfi[, c("E1","E2","E3","E4","E5")]
X$E1 <- 7 - X$E1 # 逆転項目
X$E2 <- 7 - X$E2 # 逆転項目
X <- na.omit(X)

逆転を自動処理してα(=λ3)とλ6は alpha() で取得

a <- alpha(X)                          # Cronbach's alpha と Guttman's λ6
lam3 <- unname(a$total$raw_alpha)      # λ3 = α
lam6 <- unname(a$total$G6)             # λ6(SMCベース)

λ4(最大スプリットハーフ)は splitHalf() で取得

sh <- splitHalf(X, raw = TRUE, brute = (ncol(X) <= 16))
lam4 <- unname(sh$maxrb)               # λ4 = 最大スプリットハーフ

残り(λ1, λ2, λ5)はpsychライブラリーのヘルプから実装

S   <- cov(X, use = "pairwise.complete.obs")
k   <- ncol(S)
Vx  <- sum(S)               # 総得点分散 = 1' S 1
d   <- diag(S)
off <- S; diag(off) <- 0

lam1 <- 1 - sum(d) / Vx

C2   <- sum(off^2)          # ∑_{i≠j} σ_ij^2
lam2 <- lam1 + sqrt((k/(k-1)) * C2) / Vx

row_ss <- rowSums(off^2)    # 行ごとの共分散二乗和
lam5   <- lam1 + (2 * sqrt(max(row_ss))) / Vx

λ1~λ6を示す

round(c(lambda1 = lam1,
        lambda2 = lam2,
        lambda3 = lam3,
        lambda4 = lam4,
        lambda5 = lam5,
        lambda6 = lam6), 3)
lambda1 lambda2 lambda3 lambda4 lambda5 lambda6 
  0.609   0.765   0.761   0.776   0.756   0.726

層別α(Stratified alpha)

library(sirt)
labs <- c(1, 2, 1, 2, 1)
itemstrata <- cbind(colnames(X), labs)
str_alpha <- sirt::stratified.cronbach.alpha(X, itemstrata = itemstrata)
str_alpha

0.768

https://cran.r-project.org/web/packages/sirt/refman/sirt.html#stratified.cronbach.alpha

最大信頼性(Coefficient H)

https://cran.r-project.org/web/packages/EFAtools/index.html

lavaan の1因子CFAをEFAtoolsのOMEGA()に渡す。

library(lavaan)
library(EFAtools)

model <- 'F =~ E1 + E2 + E3 + E4 + E5'
fit   <- lavaan::cfa(model, data = X, std.lv = TRUE)  # 1因子CFA
H_out <- EFAtools::OMEGA(fit)  # 名前付きベクトル; H が含まれる
H_out
Omega total and H index for the single factor:

Omega: 0.763
H index: 0.778

最大化 λ4(Guttman’s λ4)

lam4 <- psych::splitHalf(X, raw = TRUE, brute = (ncol(X) <= 16))$maxrb
lam4

[1] 0.7759781