> dat <- read.csv("http://commres.net/_media/r/fa.exercise.csv") > dat <- subset(dat, select = -c(X)) > head(dat) point.inacc nnagree easyunder easyfollow broaden.ans sophist consistency high.capa ok.w.biosedata 1 54 49 48 48 45 46 48 60 34 2 48 46 36 27 30 30 39 36 48 3 36 50 27 36 33 30 25 58 33 4 31 46 54 48 41 43 37 39 41 5 27 50 38 53 49 25 50 51 48 6 33 40 44 35 50 48 44 34 37 upto.exp easy.ui ans.2.unapp.qs satis priv.i.protect work.w.lo.res obj.ans diverse.vis easy.2.use 1 30 23 34 39 38 48 27 42 27 2 38 22 49 39 43 39 27 38 33 3 56 37 36 45 36 41 52 38 39 4 28 39 49 19 37 56 34 46 28 5 59 27 49 55 50 49 41 33 31 6 31 31 44 51 21 30 37 42 33 can.deny be.fair cust.ans efficient foll.law prov.consist accurate use.now no.save.priv diverse.fair 1 37 40 31 44 41 34 42 34 63 49 2 49 37 27 21 47 56 46 22 58 49 3 40 40 44 39 37 36 38 30 33 35 4 37 42 35 27 49 24 26 31 45 41 5 52 42 23 34 50 27 21 40 66 33 6 18 30 36 30 37 37 26 29 41 31 self.fix und.intention und.circum foll.user.well no.disguise obj.info citation fast.ans 1 56 47 29 44 35 38 32 29 2 42 29 45 29 51 49 61 21 3 35 48 29 46 45 34 46 27 4 40 35 51 38 29 40 21 28 5 46 35 44 29 32 41 21 48 6 37 53 50 47 42 29 24 32 const.qual.ans 1 48 2 48 3 24 4 30 5 31 6 34 > str(dat) 'data.frame': 1200 obs. of 37 variables: $ point.inacc : int 54 48 36 31 27 33 35 39 15 49 ... $ nnagree : int 49 46 50 46 50 40 26 45 14 50 ... $ easyunder : int 48 36 27 54 38 44 30 32 39 52 ... $ easyfollow : int 48 27 36 48 53 35 41 41 30 28 ... $ broaden.ans : int 45 30 33 41 49 50 46 37 26 26 ... $ sophist : int 46 30 30 43 25 48 21 30 34 37 ... $ consistency : int 48 39 25 37 50 44 34 28 52 39 ... $ high.capa : int 60 36 58 39 51 34 36 35 38 39 ... $ ok.w.biosedata: int 34 48 33 41 48 37 27 37 47 38 ... $ upto.exp : int 30 38 56 28 59 31 38 52 46 24 ... $ easy.ui : int 23 22 37 39 27 31 44 32 45 47 ... $ ans.2.unapp.qs: int 34 49 36 49 49 44 48 51 53 37 ... $ satis : int 39 39 45 19 55 51 46 41 48 21 ... $ priv.i.protect: int 38 43 36 37 50 21 38 53 47 30 ... $ work.w.lo.res : int 48 39 41 56 49 30 39 24 32 42 ... $ obj.ans : int 27 27 52 34 41 37 30 33 26 52 ... $ diverse.vis : int 42 38 38 46 33 42 20 38 39 46 ... $ easy.2.use : int 27 33 39 28 31 33 51 32 58 47 ... $ can.deny : int 37 49 40 37 52 18 35 46 42 58 ... $ be.fair : int 40 37 40 42 42 30 42 32 38 42 ... $ cust.ans : int 31 27 44 35 23 36 44 44 50 59 ... $ efficient : int 44 21 39 27 34 30 40 43 50 61 ... $ foll.law : int 41 47 37 49 50 37 41 52 44 53 ... $ prov.consist : int 34 56 36 24 27 37 36 26 36 39 ... $ accurate : int 42 46 38 26 21 26 32 39 34 33 ... $ use.now : int 34 22 30 31 40 29 40 37 47 46 ... $ no.save.priv : int 63 58 33 45 66 41 28 35 42 55 ... $ diverse.fair : int 49 49 35 41 33 31 35 33 15 37 ... $ self.fix : int 56 42 35 40 46 37 29 40 36 47 ... $ und.intention : int 47 29 48 35 35 53 28 42 27 54 ... $ und.circum : int 29 45 29 51 44 50 24 33 39 59 ... $ foll.user.well: int 44 29 46 38 29 47 31 56 40 63 ... $ no.disguise : int 35 51 45 29 32 42 34 40 19 35 ... $ obj.info : int 38 49 34 40 41 29 19 33 21 37 ... $ citation : int 32 61 46 21 21 24 11 26 34 38 ... $ fast.ans : int 29 21 27 28 48 32 62 47 43 42 ... $ const.qual.ans: int 48 48 24 30 31 34 25 30 16 43 ... > # > # fact.out 1 AI는 사용자의 의견이 부정확할 때 적절히 지적할 수 있어야 한다. > # nnagree 2 AI는 사용자의 주장에 무조건 동조하지 않아야 한다. > # easyunder 3 AI는 다양한 사용자 수준을 고려해 이해하기 쉬운 설명을 제공해야 한다. > # easyfollow 4 AI는 사용자가 놓칠 수 있는 핵심 정보를 효과적으로 강조할 수 있어야 한다. > # broaden.ans 5 AI는 다양한 상황을 가정해 더 넓은 범위의 해석을 제시할 수 있어야 한다. > # sophist 6 AI는 기존 데이터만 반복하며 단순한 답변을 제공해서는 안 된다. > # consistency 7 다양한 환경에서도 동일한 성능을 유지해야 한다. > # high.capa 8 많은 사용자가 동시에 사용해도 영향을 받지 않아야 한다. > # ok.w.biosedata 9 데이터가 불명확하거나 편향가능성이 있어도 사용자에게 답변을 해야 한다. > # upto.exp 10 좋은 AI는 사용자가 기대하는 답변을 해야 한다. > # easy.ui 11 좋은 AI는 직관적인 UI/UX 를 사용한다. > # ans.2.unapp.qs 12 위험하거나 부적절한 요청에 대해서도 답변해야 한다. > # satis 13 해당 AI에서 제공한 답변에 나는 만족하는 편이다. > # priv.i.protect 14 나는 내 개인정보가 AI에서 사용 후 타 사용자가 접근하지 못하는게 좋은 AI다. > # work.w.lo.res 15 해당 AI가 낮은 사양의 PC에서도 잘 동작한다. > # obj.ans 16 AI는 내 의견이나 견해에 객관적인 답변을 준다. > # diverse.vis 17 좋은 AI는 내가 생각하지 못한 관점을 제시해 주어야 한다. > # easy.2.use 18 사용하기 쉬운 AI는 좋은 AI다. > # can.deny 19 AI는 윤리적 판단에서 상황을 고려해 필요한 경우 거부할 수 있어야 한다. > # be.fair 20 AI는 편향을 그대로 따르지 않고 공정성을 보완해야 한다. > # cust.ans 21 AI는 개인 정보를 최소로 사용하며 맞춤형 서비스를 제공해야 한다. > # efficient 22 AI는 효율성과 기본적인 정서 이해를 함께 갖춰야 한다. > # foll.law 23 AI는 법을 지키면서도 피해를 줄이는 판단을 해야 한다. > # `deleted `deleted AI는 인간을 대체하기보다 협력하여 보완적 역할을 해야 한다. > # prov.consist 25 AI가 제공하는 정보는 일관되어야한다. > # accurate 26 AI가 제공하는 정보는 정확해야한다. > # use.now 27 누구나 복잡한 설명 없이 바로 사용할 수 있어야 한다. > # no.save.priv 28 AI는 사용자의 개인정보를 저장해서는 안된다. > # diverse.fair 29 AI가 도출한 결과가 편향되어서는 안된다. > # self.fix 30 AI가 자신이 도출한 결과의 오류를 스스로 발견할 수 있어야한다. > # und.intention 31 AI는 내 질문 의도를 정확히 파악한다. > # und.circum 32 AI는 내 이야기의 맥락을 잘 이해한다. > # foll.user.well 33 AI는 내가 원하는 방향에 맞는 답변을 제공한다. > # no.disguise 34 AI는 잘못된 정보를 사실처럼 전달하지 않는다. > # obj.info 35 AI는 과장 없이 객관적인 정보를 제공한다. > # citation 36 AI는 자신의 답변에 대해 명확한 근거를 제시한다. > # fast.ans 37 AI는 빠르게 응답하여 대화 흐름을 끊지 않는다. > # const.qual.ans 38 AI는 일관된 품질의 답변을 제공한다. > # > > fa.1 <- fa(dat, rotate = "none") > str(fa.1) List of 51 $ residual : num [1:37, 1:37] 0.9981 0.2756 0.3074 -0.013 -0.0726 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... $ dof : num 629 $ chi : num 37001 $ nh : num 1200 $ rms : num 0.152 $ EPVAL : num 0 $ crms : num 0.157 $ EBIC : num 32541 $ ESABIC : num 34539 $ fit : num 0.232 $ fit.off : num 0.294 $ sd : num 0.145 $ factors : num 1 $ complexity : Named num [1:37] 1 1 1 1 1 1 1 1 1 1 ... ..- attr(*, "names")= chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... $ n.obs : int 1200 $ objective : num 9.42 $ criteria : Named num [1:3] 9.42 NA NA ..- attr(*, "names")= chr [1:3] "objective" "" "" $ STATISTIC : num 11162 $ PVAL : num 0 $ Call : language fa(r = dat, rotate = "none") $ null.model : num 12.5 $ null.dof : num 666 $ null.chisq : num 14822 $ TLI : num 0.212 $ CFI : num 0.256 $ RMSEA : Named num [1:4] 0.118 0.116 0.12 0.9 ..- attr(*, "names")= chr [1:4] "RMSEA" "lower" "upper" "confidence" $ BIC : num 6702 $ SABIC : num 8700 $ r.scores : num [1, 1] 1 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "MR1" .. ..$ : chr "MR1" $ R2 : Named num 0.879 ..- attr(*, "names")= chr "MR1" $ valid : num [1, 1] 0.648 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr "MR1" .. ..$ : chr "MR1" $ weights : num [1:37, 1] 0.01014 0.01372 0.01568 0.0091 0.00345 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... .. ..$ : chr "MR1" $ rotation : chr "none" $ hyperplane : int 26 $ communality : Named num [1:37] 0.001857 0.004449 0.008663 0.000408 0.002521 ... ..- attr(*, "names")= chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... $ communalities: Named num [1:37] 0.001856 0.004445 0.008656 0.000413 0.002525 ... ..- attr(*, "names")= chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... $ uniquenesses : Named num [1:37] 0.998 0.996 0.991 1 0.997 ... ..- attr(*, "names")= chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... $ values : num [1:37] 3.813 3.261 2.736 2.476 0.898 ... $ e.values : num [1:37] 4.39 4.24 3.7 3.46 1.89 ... $ loadings : 'loadings' num [1:37, 1] 0.0431 0.0667 0.0931 0.0202 0.0502 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... .. ..$ : chr "MR1" $ model : num [1:37, 1:37] 0.001857 0.002875 0.004011 0.000871 0.002164 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... $ fm : chr "minres" $ Structure : 'loadings' num [1:37, 1] 0.0431 0.0667 0.0931 0.0202 0.0502 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... .. ..$ : chr "MR1" $ method : chr "regression" $ scores : num [1:1200, 1] 0.279 1.483 -0.486 -1.03 -0.93 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:1200] "1" "2" "3" "4" ... .. ..$ : chr "MR1" $ R2.scores : num 0.879 $ r : num [1:37, 1:37] 1 0.2785 0.3114 -0.0122 -0.0704 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... $ np.obs : num [1:37, 1:37] 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... .. ..$ : chr [1:37] "point.inacc" "nnagree" "easyunder" "easyfollow" ... $ fn : chr "fa" $ Vaccounted : num [1:2, 1] 3.813 0.103 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:2] "SS loadings" "Proportion Var" .. ..$ : chr "MR1" $ ECV : num 0.103 - attr(*, "class")= chr [1:2] "psych" "fa" > fa.1$e.values [1] 4.3930282 4.2359780 3.6971401 3.4573216 1.8924344 1.5818007 1.5654579 0.8074431 0.7646115 [10] 0.7292640 0.7107360 0.6854662 0.6793629 0.6546534 0.6432294 0.6410874 0.6270410 0.6138474 [19] 0.5854862 0.5676300 0.5648879 0.5357202 0.5244996 0.5105997 0.4984350 0.4902602 0.4790492 [28] 0.4553453 0.4310296 0.4272239 0.4209539 0.3943960 0.3833908 0.3646345 0.3571190 0.3350290 [37] 0.2944067 > nf <- table(fa.1$e.values > 1)[2] > nf TRUE 7 > fa.2 <- fa(dat, nfactors = nf, rotate = "varimax",fm = "minres") > fa.sort(fa.2) Factor Analysis using method = minres Call: fa(r = dat, nfactors = nf, rotate = "varimax", fm = "minres") Standardized loadings (pattern matrix) based upon correlation matrix MR1 MR2 MR3 MR4 MR5 MR6 MR7 h2 u2 com const.qual.ans 0.80 0.00 0.01 -0.03 0.02 -0.01 -0.03 0.65 0.35 1.0 no.disguise 0.79 0.02 0.05 -0.02 -0.01 0.01 0.02 0.63 0.37 1.0 citation 0.69 0.02 0.03 -0.03 -0.02 -0.01 0.00 0.48 0.52 1.0 diverse.fair 0.68 0.03 0.12 -0.02 0.01 0.01 0.04 0.48 0.52 1.1 accurate 0.67 -0.02 0.01 0.01 0.00 -0.01 0.02 0.45 0.55 1.0 prov.consist 0.66 -0.01 -0.02 -0.03 0.00 0.01 -0.04 0.44 0.56 1.0 obj.info 0.58 -0.01 -0.04 0.03 -0.02 -0.01 0.03 0.34 0.66 1.0 self.fix 0.57 0.02 0.01 0.00 0.09 0.04 0.01 0.33 0.67 1.1 diverse.vis 0.02 0.79 0.01 -0.03 -0.01 0.03 0.11 0.65 0.35 1.0 foll.user.well 0.03 0.71 -0.03 0.02 0.00 -0.05 -0.03 0.52 0.48 1.0 und.intention 0.00 0.71 0.00 -0.01 0.01 0.00 -0.02 0.51 0.49 1.0 easyunder 0.03 0.68 -0.01 -0.01 -0.04 -0.03 0.05 0.47 0.53 1.0 sophist 0.01 0.60 0.01 0.04 -0.05 0.01 -0.04 0.36 0.64 1.0 und.circum -0.01 0.59 -0.01 0.01 -0.05 -0.01 -0.02 0.35 0.65 1.0 nnagree 0.00 0.56 0.04 -0.02 0.01 -0.01 0.00 0.32 0.68 1.0 obj.ans 0.00 0.52 -0.01 0.00 0.02 0.01 0.01 0.27 0.73 1.0 point.inacc -0.01 0.49 0.01 0.02 -0.01 0.00 -0.05 0.24 0.76 1.0 foll.law 0.02 0.07 0.79 0.01 -0.02 -0.02 0.01 0.63 0.37 1.0 ans.2.unapp.qs 0.03 -0.01 0.71 0.00 0.00 -0.02 0.03 0.51 0.49 1.0 priv.i.protect 0.00 -0.08 0.69 -0.02 0.03 0.00 -0.01 0.48 0.52 1.0 can.deny 0.00 0.00 0.69 -0.03 0.00 0.03 -0.01 0.48 0.52 1.0 ok.w.biosedata 0.08 -0.02 0.63 0.02 -0.01 0.03 -0.01 0.41 0.59 1.0 be.fair 0.01 0.10 0.60 0.01 0.00 0.01 -0.01 0.38 0.62 1.1 no.save.priv 0.00 -0.05 0.58 0.03 0.04 -0.01 0.00 0.34 0.66 1.0 use.now -0.04 0.00 0.01 0.83 -0.02 -0.02 0.08 0.70 0.30 1.0 cust.ans -0.01 0.13 0.03 0.80 -0.05 0.01 -0.01 0.67 0.33 1.1 efficient 0.02 -0.03 -0.03 0.71 0.09 0.02 -0.03 0.51 0.49 1.0 fast.ans -0.03 -0.01 0.02 0.68 0.06 -0.02 -0.03 0.47 0.53 1.0 easy.ui -0.02 -0.03 -0.04 0.62 0.01 -0.01 -0.07 0.39 0.61 1.0 easy.2.use 0.00 -0.01 0.04 0.57 0.00 -0.04 0.02 0.33 0.67 1.0 consistency 0.03 -0.06 0.00 0.07 0.76 -0.02 0.00 0.58 0.42 1.0 high.capa 0.00 -0.01 0.01 0.03 0.69 0.02 0.00 0.47 0.53 1.0 work.w.lo.res 0.03 -0.02 0.03 -0.01 0.56 -0.01 0.00 0.31 0.69 1.0 upto.exp 0.00 -0.01 0.03 0.00 0.01 0.87 0.01 0.76 0.24 1.0 satis 0.03 -0.02 -0.01 -0.05 -0.02 0.66 0.00 0.44 0.56 1.0 broaden.ans 0.04 -0.03 0.00 -0.03 0.04 0.01 0.80 0.64 0.36 1.0 easyfollow 0.00 0.00 0.00 -0.02 -0.03 0.00 0.66 0.44 0.56 1.0 MR1 MR2 MR3 MR4 MR5 MR6 MR7 SS loadings 3.78 3.69 3.22 3.03 1.39 1.20 1.12 Proportion Var 0.10 0.10 0.09 0.08 0.04 0.03 0.03 Cumulative Var 0.10 0.20 0.29 0.37 0.41 0.44 0.47 Proportion Explained 0.22 0.21 0.18 0.17 0.08 0.07 0.06 Cumulative Proportion 0.22 0.43 0.61 0.79 0.87 0.94 1.00 Mean item complexity = 1 Test of the hypothesis that 7 factors are sufficient. df null model = 666 with the objective function = 12.5 with Chi Square = 14821.72 df of the model are 428 and the objective function was 0.34 The root mean square of the residuals (RMSR) is 0.01 The df corrected root mean square of the residuals is 0.01 The harmonic n.obs is 1200 with the empirical chi square 230.25 with prob < 1 The total n.obs was 1200 with Likelihood Chi Square = 400.55 with prob < 0.83 Tucker Lewis Index of factoring reliability = 1.003 RMSEA index = 0 and the 90 % confidence intervals are 0 0.007 BIC = -2634 Fit based upon off diagonal values = 1 Measures of factor score adequacy MR1 MR2 MR3 MR4 MR5 MR6 MR7 Correlation of (regression) scores with factors 0.94 0.94 0.93 0.94 0.86 0.89 0.85 Multiple R square of scores with factors 0.89 0.88 0.86 0.88 0.73 0.80 0.73 Minimum correlation of possible factor scores 0.78 0.75 0.73 0.76 0.47 0.59 0.46 > print(fa.2$loadings, cutoff = 0.3, sort = T) Loadings: MR1 MR2 MR3 MR4 MR5 MR6 MR7 prov.consist 0.664 accurate 0.672 diverse.fair 0.677 self.fix 0.566 no.disguise 0.790 obj.info 0.582 citation 0.692 const.qual.ans 0.804 nnagree 0.562 easyunder 0.677 sophist 0.598 obj.ans 0.522 diverse.vis 0.795 und.intention 0.711 und.circum 0.587 foll.user.well 0.714 ok.w.biosedata 0.630 ans.2.unapp.qs 0.712 priv.i.protect 0.690 can.deny 0.688 be.fair 0.605 foll.law 0.792 no.save.priv 0.582 easy.ui 0.615 easy.2.use 0.573 cust.ans 0.803 efficient 0.706 use.now 0.832 fast.ans 0.681 consistency 0.756 high.capa 0.685 work.w.lo.res 0.558 upto.exp 0.870 satis 0.658 easyfollow 0.663 broaden.ans 0.799 point.inacc 0.492 MR1 MR2 MR3 MR4 MR5 MR6 MR7 SS loadings 3.777 3.690 3.215 3.026 1.389 1.205 1.120 Proportion Var 0.102 0.100 0.087 0.082 0.038 0.033 0.030 Cumulative Var 0.102 0.202 0.289 0.370 0.408 0.441 0.471