章末クイズの答えの補足

Chapter 1

1

#lavaanのプログラム文を載せる。

#因子の分散を1に固定した場合の非標準化解を求めるためのスクリプト

library(lavaan)

library(psych)

 

#NAを含むデータを除外する

bfi2<-na.omit(bfi)

 

#モデル指定

model.q1.1 <- '

f =~ N1+N2+N3+N4+N5

N1 ~~ N1

N2 ~~ N2

N3 ~~ N3

N4 ~~ N4

N5 ~~ N5

f ~~ 1*f

'

#lavaanを実行する

fit.q1.1 <- lavaan(model.q1.1, data=bfi2[,16:20])

 

#結果を出力する

summary(fit.q1.1, standardized=T, rsquare=T, fit.measure=T)

 

#因子負荷量

#1.295(N1),1.232(N2),1.147(N3),0.863(N4),0.815(N5)

 

#誤差分散

#0.769(N1),0.836(N2),1.231(N3),1.689(N4),1.966(N5)

 

#N1に対する因子負荷量を1に固定した場合の非標準化解を求めるためのスクリプト

library(lavaan)

library(psych)

 

#NAを含むデータを除外する

bfi2<-na.omit(bfi)

 

#モデル指定

model.q1.1 <- '

f =~ 1*N1+N2+N3+N4+N5

N1 ~~ N1

N2 ~~ N2

N3 ~~ N3

N4 ~~ N4

N5 ~~ N5

f ~~ f

'

#lavaanを実行する

fit.q1.1 <- lavaan(model.q1.1, data=bfi2[,16:20])

 

#結果を出力する

summary(fit.q1.1, standardized=T, rsquare=T, fit.measure=T)

 

#因子負荷量

#1.000(N1),0.951(N2),0.886(N3),0.667(N4),0.629(N5)

 

#誤差分散

#0.769(N1),0.836(N2),1.231(N3),1.689(N4),1.966(N5)

 

2

lavaanプログラムは問1を参照してください。結果は以下の通り。

カッコ内は,最初の項目の因子負荷量を1に固定したとき。

その際,誤差分散の結果は変わりません。

E

因子負荷量

誤差分散

O

因子負荷量

誤差分散

E1

–0.972 (1.000)

1.673

O1

0.613 (1.000)

0.878

E2

–1.181 (1.215)

1.182

O2

–0.739 (–1.205)

1.843

E3

0.799 (–0.823)

1.162

O3

0.770 (1.255)

0.831

E4

1.016 (–1.046)

1.096

O4

0.329 (0.536)

1.273

E5

0.711 (–0.732)

1.263

O5

–0.711 (–1.160)

1.261

A

因子負荷量

誤差分散

C

因子負荷量

誤差分散

A1

–0.517 (1.000)

1.670

C1

0.666 (1.000)

1.036

A2

0.756 (–1.464)

0.766

C2

0.789 (1.184)

1.097

A3

0.983 (–1.904)

0.695

C3

0.725 (1.089)

1.130

A4

0.721 (–1.395)

1.576

C4

–0.932 (–1.399)

0.988

A5

0.785 (–1.519)

0.961

C5

–0.969 (–1.455)

1.716

Chapter 2

2

ソフトウェアの中では以下のように計算されている。

共分散行列の重複のない要素の数は8×9/2=36

因子の分散を固定した場合,母数は

・因子負荷量が8

・誤差分散が8

・因子間相関が1

で合計8+8+1=17。したがって,自由度は36–17=19

Chapter 3

1

#lavaanのプログラム文を載せる。

library(lavaan)

library(MBESS)

 

data(HS.data)

hsdata<-HS.data

colnames(hsdata) <- c("x1", "x2", "x3","x4", "x5", "x6","x7", "x8", "x9","x10", "x11", "x12","x13", "x14", "x15","x16", "x17", "x18","x19", "x20", "x21","x22", "x23", "x24","x25", "x26", "x27","x28", "x29", "x30", "x31", "x32") 

 

#モデル指定

model.q3.1 <- '

f1 =~ 1*x11+x12+x13+x14+x15

f2 =~ 1*x16+x17+x18+x19

f3 =~ 1*x20+x21+x22+x23+x24+x25

f4 =~ f1+f2+f3

x11 ~~ x11

x12 ~~ x12

x13 ~~ x13

x14 ~~ x14

x15 ~~ x15

x16 ~~ x16

x17 ~~ x17

x18 ~~ x18

x19 ~~ x19

x20 ~~ x20

x21 ~~ x21

x22 ~~ x22

x23 ~~ x23

x24 ~~ x24

x25 ~~ x25

f4 ~~ 1*f4

'

#lavaanを実行する

fit.q3.1 <- lavaan(model.q3.1, data=hsdata[,11:25])

 

#結果を出力する

summary(fit.q3.1, standardized=T, rsquare=T, fit.measure=T)

Chapter 4

1

#lavaanのプログラム文を載せる。

library(MBESS)

library(psych) #psychパッケージに含まれる関数alphaを使うため

 

data(HS.data)

hsdata<-HS.data

colnames(hsdata) <- c("x1", "x2", "x3","x4", "x5", "x6","x7", "x8", "x9","x10", "x11", "x12","x13", "x14", "x15","x16", "x17", "x18","x19", "x20", "x21","x22", "x23", "x24","x25", "x26", "x27","x28", "x29", "x30", "x31", "x32") 

 

#共分散行列から計算する方法

(ncol(hsdata[,7:30])/(ncol(hsdata[,7:30])-1))*(sum(cov(hsdata[,7:30]))-sum(diag(cov(hsdata[,7:30]))))/sum(cov(hsdata[,7:30]))

係数は0.82

 

#関数alphaを使う方法

alpha(hsdata[,7:30])

係数は0.82

Chapter 5

1

#lavaanのプログラム文を載せる。

library(lavaan)

 

#共分散行列の下三角要素の読み込み

lower <- '

4.137,

2.326, 5.569,

2.548, 3.180, 14.038'

 

#共分散行列の作成

dep.cov <- getCov(lower, names=c("parent","study","dep"))

 

#重回帰モデルの指定

model.q5.1 <- '

dep ~  parent+study

dep ~~ dep

'

 

fit.q5.1 <- lavaan(model.q5.1, sample.cov=dep.cov, sample.nobs=518)

summary(fit.q5.1, standardized=T, rsquare=T)

Chapter 6

2

#lavaanのプログラム文を載せる。

library(lavaan)

 

#共分散行列の下三角要素の読み込み

lower <- '

10.693,

3.262,11.834,

0.775,-0.306,8.768,

0.118,-0.248,4.056,12.992,

-0.731,-1.209,3.499,5.295,10.200'

 

#共分散行列の作成

q6.1.2.cov <- getCov(lower,names=c("ses1","ses2","stress1","stress2","dep"))

 

#モデルの指定(q6.1.2

model.q6.1.2 <- '

f1 =~ 1*ses1+ses2

f2 =~ 1*stress1+stress2

f2~f1

dep ~ f1+f2

'

#auto.var=TRUEで,観測変数の誤差分散と潜在変数の分散を推定する

fit.q6.1.2 <- lavaan(model.q6.1.2, auto.var=TRUE, sample.cov=q6.1.2.cov, sample.nobs=983)

summary(fit.q6.1.2, standardized=T, rsquare=T, fit.measures=TRUE)

 

#推定値,カッコ内は標準化推定値

#SES1の因子負荷量:1(0.543)

#SES2の因子負荷量:1.036(0.534)

#ストレス1の因子負荷量:1(0.557)

#ストレス2の因子負荷量:1.494(0.683)

#SES→ストレス 0.019(0.021)有意ではない

#SES→抑うつ -0.325(-0.181)1%水準で有意

#ストレス抑うつ 1.307(0.674)0.1%水準で有意

#SES1の誤差分散:7.536(0.705)

#SES2の誤差分散:8.447(0.715)

#ストレス1の誤差分散:6.046(0.690)

#ストレス2の誤差分散:6.927(0.534)

#抑うつの誤差分散:5.275(0.518)

#SES因子の分散:3.146(1.000)

#ストレス因子の誤差分散:2.712(1.000)

#抑うつの決定係数:0.482

Chapter 7

1

#平均構造を含まないモデル

library(lavaan)

 

#変数名

varnames<-c("t1","t2")

 

#1卵性の共分散行列の下三角要素の読み込み

mz <- '

0.641,

0.471,0.648'

 

#1卵性の共分散行列の作成

mz.cov <- getCov(mz,names=varnames)

 

#2卵性の共分散行列の下三角要素の読み込み

dz <- '

0.744,

0.403,0.657'

 

#2卵性の共分散行列の作成

dz.cov <- getCov(dz,names=varnames)

 

N<-list(mzG=107, dzG=94)

twin.cov<-list(mzG=mz.cov, dzG=dz.cov)

 

#フルモデル(ACEモデル)の指定

model.q7.1ace <- '

fA1 =~ c(a1,a1)*t1

fA2 =~ c(a1,a1)*t2

fC =~ c(c1,c1)*t1+c(c1,c1)*t2

fE1 =~ c(e1,e1)*t1

fE2 =~ c(e1,e1)*t2

fA1 ~~ 1*fA1

fA2 ~~ 1*fA2

fA1 ~~ c(1,0.5)*fA2

fC ~~ 1*fC

fE1 ~~ 1*fE1

fE2 ~~ 1*fE2

t1 ~~ 0*t1

t2 ~~ 0*t2

'

fit.q7.1ace <- lavaan(model.q7.1ace, sample.cov=twin.cov, sample.nobs=N)

summary(fit.q7.1ace, standardized=T, rsquare=T, fit.measures=TRUE)

 

#遺伝・非共有環境モデル(AEモデル)の指定

model.q7.1ae <- '

fA1 =~ c(a1,a1)*t1

fA2 =~ c(a1,a1)*t2

fE1 =~ c(e1,e1)*t1

fE2 =~ c(e1,e1)*t2

fA1 ~~ 1*fA1

fA2 ~~ 1*fA2

fA1 ~~ c(1,0.5)*fA2

fE1 ~~ 1*fE1

fE2 ~~ 1*fE2

t1 ~~ 0*t1

t2 ~~ 0*t2

'

fit.q7.1ae <- lavaan(model.q7.1ae, sample.cov=twin.cov, sample.nobs=N)

summary(fit.q7.1ae, standardized=T, rsquare=T, fit.measures=TRUE)

 

#共有環境・非共有環境モデル(CEモデル)の指定

model.q7.1ce <- '

fC =~ c(c1,c1)*t1+c(c1,c1)*t2

fE1 =~ c(e1,e1)*t1

fE2 =~ c(e1,e1)*t2

fC ~~ 1*fC

fE1 ~~ 1*fE1

fE2 ~~ 1*fE2

t1 ~~ 0*t1

t2 ~~ 0*t2

'

fit.q7.1ce <- lavaan(model.q7.1ce, sample.cov=twin.cov, sample.nobs=N)

summary(fit.q7.1ce, standardized=T, rsquare=T, fit.measures=TRUE)

 

#フルモデルの適合度

#AIC=864.617, RMSEA=0.000, SRMR=0.039, CFI=1.000

 

#AEモデルの適合度

#AIC=869.002, RMSEA=0.016, SRMR=0.062, CFI=0.999

 

#CEモデルの適合度

#AIC=869.621, RMSEA=0.034, SRMR=0.042, CFI=0.993

 

#最も適合の良いフルモデルの推定値

#α=0.594, γ=0.623, ε=0.510

#α^2=0.352, γ^2=0.388, ε^2=0.260

#7-5のフルモデルと比較すると,

#年齢が上昇すると,遺伝の影響が大きくなり,

#共有環境の影響が小さくなることが分かる。

 

#なお,以下のように,4つの共分散行列を同時に分析して,

#8-11歳と,12-16歳ではEの影響は同じでACの影響は

#異なる」モデルがベストフィットであることを示すこともできる。

 

#変数名

varnames<-c("t1","t2")

 

#8-11歳の1卵性の共分散行列の下三角要素の読み込み

mz8.11 <- '

0.675,

0.513,0.714'

 

#8-11歳の1卵性の共分散行列の作成

mz8.11.cov <- getCov(mz8.11,names=varnames)

 

#2卵性の共分散行列の下三角要素の読み込み

dz8.11 <- '

0.621,

0.434,0.623'

 

#2卵性の共分散行列の作成

dz8.11.cov <- getCov(dz8.11,names=varnames)

 

#12-16歳の1卵性の共分散行列の下三角要素の読み込み

mz12.16 <- '

0.641,

0.471,0.648'

 

#1卵性の共分散行列の作成

mz12.16.cov <- getCov(mz12.16,names=varnames)

 

#12-16歳の2卵性の共分散行列の下三角要素の読み込み

dz12.16 <- '

0.744,

0.403,0.657'

 

#2卵性の共分散行列の作成

dz12.16.cov <- getCov(dz12.16,names=varnames)

 

N4G<-list(mzG8.11=102, dzG8.11=97, mzG12.16=107, dzG12.16=94)

twin4G.cov<-list(mzG8.11=mz8.11.cov, dzG8.11=dz8.11.cov, mzG12.16=mz12.16.cov, dzG12.16=dz12.16.cov)

 

#AEが年代間で異なるモデルの指定

model.q7.1e4G <- '

fA1 =~ c(a1,a1,a2,a2)*t1

fA2 =~ c(a1,a1,a2,a2)*t2

fC =~ c(c1,c1,c2,c2)*t1+c(c1,c1,c2,c2)*t2

fE1 =~ c(e1,e1,e1,e1)*t1

fE2 =~ c(e1,e1,e1,e1)*t2

fA1 ~~ 1*fA1

fA2 ~~ 1*fA2

fA1 ~~ c(1,0.5,1,0.5)*fA2

fC ~~ 1*fC

fE1 ~~ 1*fE1

fE2 ~~ 1*fE2

t1 ~~ 0*t1

t2 ~~ 0*t2

'

fit.q7.1e4G <- lavaan(model.q7.1e4G, sample.cov=twin4G.cov, sample.nobs=N4G)

summary(fit.q7.1e4G, standardized=T, rsquare=T, fit.measures=TRUE)

 

#ACEのすべてが年代間で等しいモデルの指定

model.q7.1ace4G <- '

fA1 =~ c(a1,a1,a1,a1)*t1

fA2 =~ c(a1,a1,a1,a1)*t2

fC =~ c(c1,c1,c1,c1)*t1+c(c1,c1,c1,c1)*t2

fE1 =~ c(e1,e1,e1,e1)*t1

fE2 =~ c(e1,e1,e1,e1)*t2

fA1 ~~ 1*fA1

fA2 ~~ 1*fA2

fA1 ~~ c(1,0.5,1,0.5)*fA2

fC ~~ 1*fC

fE1 ~~ 1*fE1

fE2 ~~ 1*fE2

t1 ~~ 0*t1

t2 ~~ 0*t2

'

fit.q7.1ace4G <- lavaan(model.q7.1ace4G, sample.cov=twin4G.cov, sample.nobs=N4G)

summary(fit.q7.1ace4G, standardized=T, rsquare=T, fit.measures=TRUE)

 

#AEが年代間で異なるモデルモデルの適合度

#AIC=1680.831, BIC=1700.789, RMSEA=0.000, SRMR=0.053, CFI=1.000

 

#ACEのすべてが年代間で等しいモデルの適合度

#AICBICは悪くなる

#AIC=1681.434, BIC=1693.408, RMSEA=0.000, SRMR=0.049, CFI=1.000