R語言實現潛變數模型構建
- 2020 年 3 月 6 日
- 筆記
結構方程模型是基於變數的協方差矩陣來分析變數之間關係的一種統計方法。作為多元數據分析的重要工具。其可以分成兩部分:測量模型和結構模型。所謂測量模型主要是研究潛變數(因子)和顯變數(測量指標)的關係;結構模型指的是研究潛變數(因子)之間的關係。今天我們給大家介紹一個集合各種潛變數分析的模型的R包lavaan。
首先,我們看下需要安裝的包:
install.packages("lavaan") install.packages("semPlot") install.packages("semTools")
接下來我們看下在此包中回歸方程的幾種表示形式:
y ~ f1 + f2 + x1 + x2 #回歸方程~左邊為因變數 f1 =~ y1 + y2 + y3 #潛變數表示形式 y1 ~~ y1 # 方差相關性 y1 ~~ y2 # 殘差相關性 y1 ~ 1 #只有截距項的回歸方程
其中y,y1,y2,y3為因變數,f1為潛變數,x1,x2為顯變數。那麼將上面的模型展現形式綜合在一起就是下面的格式:
model <- ' # 定義潛變數 ind60 =~ x1 + x2 + x3 dem60 =~ y1 + a*y2 + b*y3 + c*y4 dem65 =~ y5 + a*y6 + b*y7 + c*y8 # 回歸方程 dem60 ~ ind60 dem65 ~ ind60 + dem60 # 殘差相關性 y1 ~~ y5 y2 ~~ y4 + y6 y3 ~~ y7 y4 ~~ y8 y6 ~~ y8 # 截距項 y1~ 1 f1 ~ 1 '
當然,如果模型的方程式太多也可以保存在txt的文件中,並且後綴名改為.lav。接下來就藉助包內的函數readLines()讀取模型的內容。另外,我們也可以直接以表格形式查看模型的構成,需要用到函數lavaanify(),我們直接看實例:
model <- ' #two latent variables with fixed loadings f1 =~ 1*y1a + 1*y1b + 1*y1c f2 =~ 1*y2a + 1*y2b + 1*y2c #intercepts constrained to be equal #using the default names y1a ~ 1 y1b ~ equal("y1a~1") * 1 y1c ~ equal("y1a~1") * 1 #intercepts constrained to be equal #using a custom label y2a ~ int2*1 y2b ~ int2*1 y2c ~ int2*1 '

接下來我們看下包中自帶的三個主要模型:
1. 驗證性因子模型(Confirmatory FactorAnalysis (CFA) model)。我們首先看下其主要函數:

我們一般會把默認的參數作為最好的設置,所以我們不一一展開參數解釋了,我們直接看實例:
首先我們看下數據源:

## The famous Holzinger and Swineford(1939) example HS.model <- ' visual =~ x1 + x2 + x3 textual =~ x4 + x5 + x6 speed =~ x7 + x8 + x9 ' fit <- cfa(HS.model, data =HolzingerSwineford1939) summary(fit, fit.measures = TRUE)

檢查模型的擬合度,使用χ2/df(小於3.0)、AGFI (>0.90)、CFI(>0.90)、 RMSEA (<0.07)與SRMR(<0.08)等指標。
接下來進行信效度的分析需要用到函數reliability()。所謂信度(Reliability)即可靠性,是指採用同一方法對同一對象進行調查時,問卷調查結果的穩定性和一致性,即測量工具(問卷或量表)能否穩定地測量所測的事物或變數;效度(Validity)即有效性,它是指測量工具或手段能夠準確測出所需測量的事物的程度。信度與效度二者的關係:信度低,效度不可能高;效度高,信度也必然高。

其中alpha>0.8,內部一致性極好;0.6-0.8較好;<0.6一致性較差。
在上述結果中omega值為CR(信度係數),其中alpha值以及AVE值都已列舉出來,可以看出AVE並未都大於0.5,alpha值並未都在0.8以上,CR值也並未都在0.8以上,說明模型信效度不是很良好。
最後我們看下我們構建的模型的結構:
semPaths(fit)

2. 結構方程模型(StructuralEquation Model (SEM))。其參數與功能和cfa基本一致,我們直接看下實例:

model <- ' #latent variable definitions ind60 =~ x1 + x2 + x3 dem60 =~ y1 + a*y2 + b*y3 + c*y4 dem65 =~ y5 + a*y6 + b*y7 + c*y8 #regressions dem60 ~ ind60 dem65 ~ ind60 + dem60 #residual correlations y1 ~~ y5 y2 ~~ y4 + y6 y3 ~~ y7 y4 ~~ y8 y6 ~~ y8 ' fit <- sem(model, data =PoliticalDemocracy) summary(fit, fit.measures = TRUE)

semPaths(fit)

3. 增長曲線模型(FitGrowth Curve Models)。一般來說,事物總是經過發生、發展、成熟三個階段,而每一個階段的發展速度各不相同。通常在發生階段,變化速度較為緩慢;在發展階段,變化速度加快;在成熟階段,變化速度又趨緩慢,按上述三個階段發展規律得到的變化曲線稱為生長曲線。我們直接看實例:

## linear growth model with a time-varyingcovariate model.syntax <- ' #intercept and slope with fixed coefficients i=~ 1*t1 + 1*t2 + 1*t3 + 1*t4 s=~ 0*t1 + 1*t2 + 2*t3 + 3*t4 #regressions i~ x1 + x2 s~ x1 + x2 #time-varying covariates t1 ~ c1 t2 ~ c2 t3 ~ c3 t4 ~ c4 ' fit <- growth(model.syntax, data =Demo.growth) summary(fit, fit.measures = TRUE)
semPaths(fit)

以上個模型都是基於lavaan函數的相關參數進行的默認運行模型,如果想更加細緻的修改各參數,需要直接調用lavaan函數。同時,此包還設置了一些對summary結構化的輸出函數:
1. parameterEstimates 直接提取各方程式的評估結果。我們直接看下實例:
parameterEstimates(fit)

2. parTable() 模型參數列表,輸出為data.frame格式。
parTable(fit)

當我們在模型中加入等式約束時,我們可以評估等式約束的可靠性需要用到函數lavTestScore。我們直接看下包的實例:
HS.model <- ' visual =~ x1 + b1*x2 + x3 textual =~ x4 + b2*x5 + x6 speed =~ x7 + b3*x8 + x9 b1 == b2 b2 == b3 ' fit <- cfa(HS.model,data=HolzingerSwineford1939) # test 1: release both two equality constraints lavTestScore(fit, cumulative = TRUE)

與此同時此包還添加了模型之間的對比函數lavTestLRT,可以對比兩個模型是否有差異。實例:
HS.model <- ' visual =~ x1 + b1*x2 + x3 textual =~ x4 + b2*x5 + x6 speed =~ x7 + b3*x8 + x9 ' fit1 <- cfa(HS.model, data =HolzingerSwineford1939) fit0 <- cfa(HS.model, data =HolzingerSwineford1939, orthogonal = TRUE) lavTestLRT(fit1, fit0)

至此就是目前此包的重點內容了,歡迎大家互相學習交流!