<- foreign::read.spss("datasets/例22-02.sav",to.data.frame = T,
df reencode = "utf-8")
names(df) <- c("年","月","门诊人次","出院人数","病床利用率","病床周转次数",
"平均住院天数","治愈好转率","病死率","诊断符合率","抢救成功率")
str(df)
## 'data.frame': 36 obs. of 11 variables:
## $ 年 : num 1991 1991 1991 1991 1991 ...
## $ 月 : num 1 2 3 4 5 6 7 8 9 10 ...
## $ 门诊人次 : num 4.34 3.45 4.38 4.18 4.32 4.13 4.57 4.31 4.06 4.43 ...
## $ 出院人数 : num 389 271 385 377 378 349 361 209 425 458 ...
## $ 病床利用率 : num 99.1 88.3 104 99.5 102 ...
## $ 病床周转次数: num 1.23 0.85 1.21 1.19 1.19 1.1 1.14 0.52 0.93 0.95 ...
## $ 平均住院天数: num 25.5 23.6 26.5 26.9 27.6 ...
## $ 治愈好转率 : num 93.2 94.3 92.5 93.9 93.2 ...
## $ 病死率 : num 3.56 2.44 4.02 2.92 1.99 4.38 2.73 3.65 3.09 4.21 ...
## $ 诊断符合率 : num 97.5 97.9 98.5 99.4 99.7 ...
## $ 抢救成功率 : num 61.7 73.3 76.8 63.2 80 ...
## - attr(*, "variable.labels")= Named chr [1:11] "" "" "" "" ...
## ..- attr(*, "names")= chr [1:11] "...." ".·." ".....˴." "..Ժ...." ...
::headTail(df)
psych## 年 月 门诊人次 出院人数 病床利用率 病床周转次数 平均住院天数 治愈好转率
## 1 1991 1 4.34 389 99.06 1.23 25.46 93.15
## 2 1991 2 3.45 271 88.28 0.85 23.55 94.31
## 3 1991 3 4.38 385 103.97 1.21 26.54 92.53
## 4 1991 4 4.18 377 99.48 1.19 26.89 93.86
## ... ... ... ... ... ... ... ... ...
## 33 1993 9 3.9 555 80.58 1.1 23.08 94.38
## 34 1993 10 3.62 554 87.21 1.1 22.5 92.43
## 35 1993 11 3.75 586 90.31 1.12 23.73 92.47
## 36 1993 12 3.77 627 86.47 1.24 23.22 91.17
## 病死率 诊断符合率 抢救成功率
## 1 3.56 97.51 61.66
## 2 2.44 97.94 73.33
## 3 4.02 98.48 76.79
## 4 2.92 99.41 63.16
## ... ... ... ...
## 33 2.06 96.82 91.79
## 34 3.22 97.16 87.77
## 35 2.07 97.74 93.89
## 36 3.4 98.98 89.8
24 R语言因子分析
因子分析可以看做是主成分分析的进一步扩展,主成分分析重点在综合原始变量的信息,而因子分析重在解释原始变量之间的关系。
主成分并没有实际的意义,只是原始变量的线性组合,但是因子有明确的意义,是可以解释的。
因子分析的步骤和主成分也是差不多的,关于因子分析前的一些准备工作可以参考之前主成分分析的步骤,比如相关矩阵的计算,KMO检验和Bartlett球形检验等,这里不再介绍。
只有数据之间的相关性好,才有可能提炼出公共因子,建议大家相关性分析和两个检验不要忘记。
24.1 演示数据
数据来自于孙振球医学统计学第4版例22-2.
某医院为了评价医疗工作质量,收集了三年的门诊人次、出院人数、病床利用率、病床周转次数、平均住院天数、治愈好转率、病死率、诊断符合率、抢救成功率9个指标,采用因子分析方法,探讨其综合评价体系。
24.2 判断需要提取的因子个数
R中自带了factanal()
进行因子分析,不过不如psych
包好用,我们这里使用psych
包演示。
# 只用后面9列数据
<- df[,-c(1,2)]
df.use
library(psych)
# 碎石图
fa.parallel(df.use, fa = "both",fm="ml")
## Parallel analysis suggests that the number of factors = 3 and the number of components = 3
通过参数fa = "both"
同时给出了PCA和因子分析的碎石图,根据因子分析碎石图的结果,建议我们提取3个因子。
但是提取几个因子并没有绝对的标准,我们可以结合多种方法或专业知识,和提取主成分的方法类似,可以参考之前的介绍的方法:R语言主成分分析
除此之外,还可以结合特征值大小、累计贡献率来确定使用几个因子。
下面我们首先用9个因子进行因子分析,看看结果再说。
rotate
参数确定旋转方法,有多种不同的选择,比如不旋转、正交旋转法(比如最大方差法)、斜交旋转法等,
fm
参数选择因子计算方法,比如最大似然法ml、主轴迭代法pa、加权最小二乘wls、广义加权最小二乘gls、最小残差minres,等。
# 进行因子分析,首先9个因子用一下看看结果再说,最大似然法,不旋转
<- fa(df.use, nfactors = 9, rotate = "none", fm="ml")
fa.res
fa.res## Factor Analysis using method = ml
## Call: fa(r = df.use, nfactors = 9, rotate = "none", fm = "ml")
## Standardized loadings (pattern matrix) based upon correlation matrix
## ML1 ML2 ML3 ML4 ML5 ML6 ML7 ML8 ML9 h2 u2 com
## 门诊人次 0.14 0.68 0.09 0.37 -0.06 -0.03 0 0 0 0.63 0.37 1.7
## 出院人数 0.68 -0.30 0.19 0.32 0.06 0.03 0 0 0 0.69 0.31 2.1
## 病床利用率 0.58 0.52 -0.09 -0.31 0.04 0.05 0 0 0 0.71 0.29 2.6
## 病床周转次数 0.90 0.20 -0.01 -0.01 0.01 -0.01 0 0 0 0.85 0.15 1.1
## 平均住院天数 -0.53 0.43 0.38 0.05 0.02 0.09 0 0 0 0.62 0.38 2.9
## 治愈好转率 -0.03 -0.07 0.69 -0.18 0.13 -0.02 0 0 0 0.53 0.47 1.2
## 病死率 -0.33 0.08 -0.46 0.18 0.24 0.09 0 0 0 0.42 0.58 2.9
## 诊断符合率 -0.31 0.54 0.02 0.02 -0.15 0.07 0 0 0 0.41 0.59 1.8
## 抢救成功率 0.41 -0.64 0.07 -0.03 -0.12 0.10 0 0 0 0.60 0.40 1.9
##
## ML1 ML2 ML3 ML4 ML5 ML6 ML7 ML8 ML9
## SS loadings 2.27 1.75 0.89 0.40 0.12 0.04 0.00 0.00 0.00
## Proportion Var 0.25 0.19 0.10 0.04 0.01 0.00 0.00 0.00 0.00
## Cumulative Var 0.25 0.45 0.55 0.59 0.60 0.61 0.61 0.61 0.61
## Proportion Explained 0.41 0.32 0.16 0.07 0.02 0.01 0.00 0.00 0.00
## Cumulative Proportion 0.41 0.74 0.90 0.97 0.99 1.00 1.00 1.00 1.00
##
## Mean item complexity = 2
## Test of the hypothesis that 9 factors are sufficient.
##
## df null model = 36 with the objective function = 3.82 with Chi Square = 119.03
## df of the model are -9 and the objective function was 0.46
##
## The root mean square of the residuals (RMSR) is 0.04
## The df corrected root mean square of the residuals is NA
##
## The harmonic n.obs is 36 with the empirical chi square 3.42 with prob < NA
## The total n.obs was 36 with Likelihood Chi Square = 11.69 with prob < NA
##
## Tucker Lewis Index of factoring reliability = 2.377
## Fit based upon off diagonal values = 0.99
## Measures of factor score adequacy
## ML1 ML2 ML3 ML4 ML5
## Correlation of (regression) scores with factors 0.94 0.90 0.79 0.70 0.42
## Multiple R square of scores with factors 0.88 0.80 0.63 0.50 0.18
## Minimum correlation of possible factor scores 0.77 0.61 0.26 -0.01 -0.65
## ML6 ML7 ML8 ML9
## Correlation of (regression) scores with factors 0.26 0 0 0
## Multiple R square of scores with factors 0.07 0 0 0
## Minimum correlation of possible factor scores -0.86 -1 -1 -1
h2是公因子方差,表示因子对每个变量的解释度,u2=1-h2,表示不能被因子解释的比例。
看结果中的Cumulative Var
,累积方差解释,可以看到在使用3个因子时,累计贡献度是0.55,4个因子是0.59,结合碎石图,我们选择用4个因子。
24.3 进行因子分析
选择4个因子
# 选择4个因子,不旋转,最大似然法
<- fa(df.use, nfactors = 4, rotate = "none", fm="ml")
fa.res
fa.res## Factor Analysis using method = ml
## Call: fa(r = df.use, nfactors = 4, rotate = "none", fm = "ml")
## Standardized loadings (pattern matrix) based upon correlation matrix
## ML3 ML1 ML2 ML4 h2 u2 com
## 门诊人次 0.61 0.78 0.11 -0.01 1.00 0.005 1.9
## 出院人数 -0.40 0.31 0.34 -0.59 0.72 0.276 3.1
## 病床利用率 -0.30 0.56 0.25 0.49 0.71 0.289 2.9
## 病床周转次数 -0.55 0.75 0.35 0.01 1.00 0.005 2.3
## 平均住院天数 0.67 -0.13 0.16 0.26 0.57 0.435 1.5
## 治愈好转率 0.15 -0.39 0.91 0.00 1.00 0.005 1.4
## 病死率 0.14 -0.07 -0.47 0.10 0.26 0.743 1.3
## 诊断符合率 0.45 0.11 -0.10 0.36 0.36 0.642 2.2
## 抢救成功率 -0.56 -0.12 0.05 -0.46 0.55 0.455 2.1
##
## ML3 ML1 ML2 ML4
## SS loadings 1.94 1.79 1.40 1.02
## Proportion Var 0.22 0.20 0.16 0.11
## Cumulative Var 0.22 0.41 0.57 0.68
## Proportion Explained 0.32 0.29 0.23 0.17
## Cumulative Proportion 0.32 0.61 0.83 1.00
##
## Mean item complexity = 2.1
## Test of the hypothesis that 4 factors are sufficient.
##
## df null model = 36 with the objective function = 3.82 with Chi Square = 119.03
## df of the model are 6 and the objective function was 0.24
##
## The root mean square of the residuals (RMSR) is 0.04
## The df corrected root mean square of the residuals is 0.09
##
## The harmonic n.obs is 36 with the empirical chi square 3.43 with prob < 0.75
## The total n.obs was 36 with Likelihood Chi Square = 6.84 with prob < 0.34
##
## Tucker Lewis Index of factoring reliability = 0.931
## RMSEA index = 0.055 and the 90 % confidence intervals are 0 0.235
## BIC = -14.67
## Fit based upon off diagonal values = 0.99
## Measures of factor score adequacy
## ML3 ML1 ML2 ML4
## Correlation of (regression) scores with factors 1.00 1.00 1.00 0.87
## Multiple R square of scores with factors 0.99 1.00 0.99 0.75
## Minimum correlation of possible factor scores 0.99 0.99 0.99 0.50
选择4个因子,最终的累积方差解释是0.68,再看因子载荷矩阵,因子1(ML1)在病床周转、门诊人次、病床利用率等具有较高的载荷,因子2在治愈好转率方面具有很大的载荷,因子3在门诊人次,平均住院天数、抢救成功率具有较高的载荷,因子4在出院人数具有较高的载荷。
从专业角度来看,并没有发现什么规律,好像不能很好的解释专业意义。
所以我们需要进行因子旋转!
24.4 因子旋转
通过因子旋转我们可以更容易找到内在规律,使得结果更加容易结合专业背景进行解释。
# 选择4个因子,最大方差旋转,最大似然法
<- fa(df.use, nfactors = 4, rotate = "varimax", fm="ml")
fa.res
fa.res## Factor Analysis using method = ml
## Call: fa(r = df.use, nfactors = 4, rotate = "varimax", fm = "ml")
## Standardized loadings (pattern matrix) based upon correlation matrix
## ML3 ML1 ML2 ML4 h2 u2 com
## 门诊人次 -0.31 0.23 -0.03 0.92 1.00 0.005 1.4
## 出院人数 0.75 0.16 0.24 0.27 0.72 0.276 1.6
## 病床利用率 -0.10 0.83 0.03 0.07 0.71 0.289 1.0
## 病床周转次数 0.46 0.84 0.09 0.26 1.00 0.005 1.8
## 平均住院天数 -0.64 -0.23 0.24 0.21 0.57 0.435 1.8
## 治愈好转率 -0.09 -0.09 0.98 -0.10 1.00 0.005 1.1
## 病死率 -0.20 -0.18 -0.42 -0.06 0.26 0.743 1.9
## 诊断符合率 -0.56 0.02 -0.10 0.18 0.36 0.642 1.3
## 抢救成功率 0.70 -0.04 0.04 -0.21 0.55 0.455 1.2
##
## ML3 ML1 ML2 ML4
## SS loadings 2.15 1.58 1.29 1.12
## Proportion Var 0.24 0.18 0.14 0.12
## Cumulative Var 0.24 0.41 0.56 0.68
## Proportion Explained 0.35 0.26 0.21 0.18
## Cumulative Proportion 0.35 0.61 0.82 1.00
##
## Mean item complexity = 1.4
## Test of the hypothesis that 4 factors are sufficient.
##
## df null model = 36 with the objective function = 3.82 with Chi Square = 119.03
## df of the model are 6 and the objective function was 0.24
##
## The root mean square of the residuals (RMSR) is 0.04
## The df corrected root mean square of the residuals is 0.09
##
## The harmonic n.obs is 36 with the empirical chi square 3.43 with prob < 0.75
## The total n.obs was 36 with Likelihood Chi Square = 6.84 with prob < 0.34
##
## Tucker Lewis Index of factoring reliability = 0.931
## RMSEA index = 0.055 and the 90 % confidence intervals are 0 0.235
## BIC = -14.67
## Fit based upon off diagonal values = 0.99
## Measures of factor score adequacy
## ML3 ML1 ML2 ML4
## Correlation of (regression) scores with factors 0.93 0.96 1.00 0.98
## Multiple R square of scores with factors 0.86 0.92 0.99 0.96
## Minimum correlation of possible factor scores 0.72 0.85 0.99 0.91
此时我们再看因子载荷阵,因子3在门诊人次、出院人数、病床周转、平均住院天数、诊断符合率、抢救成功率等多个指标上具有较大的载荷,因子2在治愈好转率、病死率上载荷最大,因子1在病床利用率、病床周转率这两个指标上载荷最高,因子4在门诊人次、出院人数这两个指标的载荷最大。
因此可以认为因子3反映了反映了医疗工作质量各个方面的情况,称为综合因子;因子1反应病床利用情况,可以成为病床利用因子;因子2反映了医疗水平,称为水平因子;因子4反应了就诊患者数量,称为数量因子。
可以把结果可视化:
fa.diagram(fa.res)
factor.plot(fa.res)
关于因子分析,我并没有找到好用的可视化R包,如果大家知道,欢迎评论区留言。