心理尺度の信頼性係数オメガωのベイズ分析
本ウェブサイトのスクリプトは、CmdStanPyを利用している。CmdStanPyの準備の簡単な説明をこのウェブサイトに用意した。
心理尺度の信頼性係数として、オメガω(McDonald, 1999)は、項目jの得点
の因子モデル
![]()
に基づいて算出される(岡本、2014、第8章)。ここで、
は測定対象の因子の値、
は項目jに固有の特性など残差項(誤差項)としてまとめられるものである。
は平均0、分散1に標準化されたものを考えるが、
は素点である。
項目が
項目あるとし、それらの合計点
がテスト得点として算出されるとする。

である。このとき、オメガは次式で与えられる。
![]()
の平均が0、分散が1であることから式(3)は
![]()
と書ける。式番号(6.20a)はMcDonald (1999)におけるものである。
さらに、各
が他の変数と独立であるとすると、式(6.20a)は
![]()
と書ける。
まず、与えられたデータの分析を行うが、不適切な項目が見つかったので、不適切な項目を除いた再分析も行った。
ベイズ分析のためのStanスクリプトを用いる例をリスト1に、リスト1のStanスクリプトを用いるPythonスクリプトをリスト2に示した。ファイルは、まとめて圧縮ファイルestomegafiles.zipとした。リスト2は、CmdStanPyを利用しているが、CmdStanPyの準備の簡単な説明は、このウェブサイトで行った
リスト2のスクリプト(EstOmega.py)は、リスト2のファイル、リスト1のファイル、および入力データファイルを同じフォルダに置き、カレントディレクトリをそのフォルダに移動してから、次のようなコマンドにより実行する。
(stan)
*****/estomegafiles$ python EstOmega.py
上のコマンドを実行すると、出力ファイル名と入力データファイル名の設定が求められる。
(stan) *****/estomegafiles$ python
EstOmega.py
Output file (*.txt) = Results.txt
Input Excel data file (*.xlsx) =
Data.xlsx
上の例では、出力ファイル名としてResults.txtが設定されている。出力ファイル名は、テキストファイル名(*.txt)であれば、任意である。
出力ファイル名を設定すると、入力データファイル名の設定が求められる。
入力データファイルはExcelファイルとして図A1のように用意する。

図A1
1行目に変数名を設定して、次の2行目からデータを設定する。ただし、1列目はデータの識別用値を設定する。1列目の値は、分析では無視される。
入力データファイル名を設定すると、ファイルが読み込まれ、リスト1のStanスクリプトのコンパイルが始まる。コンパイルは、多少時間が掛かる。コンパイル後、MCMCサンプリングが始まる。MCMCサンプリングが終了すると、MCMCサンプリングの統計出力が行われ、その後、図A2のグラフが表示される。

図A2
の事後分布のグラフである。
図A2のWindowを閉じると、
の事後分布が表示される(図A3)。

図A3
図A3のWindowを閉じると、
の事後分布のグラフが表示される(図A4)。

図A4
図A4のWindowを閉じると、次に、変数ごとに各変数における因子
の分散の各変数の分散に対する比
![]()
の事後分布のグラフが表示される(図A5)。この値は、各変数に占める因子の割合と考えられる。

図A5
図A5のWindowを閉じると、ωの事後分布のグラフが表示される(図A6)。

図A6
グラフのタイトル部に、事後分布の四分位数が表示されている。点推定値は、Gelmanら(2021)に従えば中央値(median)を点推定値とすればよいので、
となる。
図A6のフォームを閉じると、図A7の散布図が表示される。

図A7
横軸に各
の推定値
(事後分布の中央値)、縦軸にテストスコアの和
をとり、プロットしたものである。点
がほぼ直線沿いに散らばっていることが判る。
図A7のWindowを閉じると、スクリプトの実行終了となる。端末画面には、次のメッセージが表示されている。
omega:  Q1 = 0.898,  Med = 0.904,  Q3 = 0.911
Results.txt
was saved.
(stan)
*****/estomegafiles$
出力ファイルResults.txtを開くと、以下のようになっている。
Input data file = Data.xlsx
data...
[[ 1 79 46 68 65 89 38 58 70 49 65]
 [ 2 48 71 61 50 43 27 48 54 34 61]
 [ 3 38 42 38 45 55 43 47 39 65 54]
 [ 4 45 51 30 71 63 45 62 58 34 51]
 [ 5 74 54 47 60 44 59 66 80 45 54]
 [ 6 63 66 58 62 74 31 75 74 58 67]
 [ 7 65 65 61 52 62 29 64 60 29 64]
 [ 8 72 85 89 82 75 11 76 73 60 82]
 [ 9 31 34 27 39 40 34 25 27 36 26]
 [10 62 78 45 61 60 60 47 39 63 48]
 [11 61 51 22 67 29 73 38 56 62 44]
 [12 28 31 28 18 30 37 34 32 47 44]
 [13 60 75 60 64 64 57 46 72 75 64]
 [14 60 62 63 40 63 58 45 65 64 82]
 [15 67 61 66 66 79 62 80 71 43 89]
 [16 55 33 45 24 35 29 36 26 37 26]
 [17 44 51 40 28 45 35 59 32 38 35]
 [18 64 71 40 46 46 26 76 75 21 72]
 [19 25 41 27 36 37 71 29 19 42 40]
 [20 56 47 41 32 50 42 41 45 50 22]
 [21 41 49 78 53 41 32 56 39 28 40]
 [22 62 64 49 49 60 74 59 51 47 64]
 [23 60 55 65 50 48 32 54 53 67 57]
 [24 48 64 63 41 50 19 54 63 53 70]
 [25 73 76 51 71 72 65 81 66 15 94]
 [26 71 67 59 85 87 43 66 80 41 83]
 [27 69 56 48 35 50 43 42 53 42 48]
 [28 54 53 47 69 53 47 65 59 35 59]
 [29 47 72 68 83 77 58 61 71 51 81]
 [30 16 30 32 16 34 47 36 30 45 18]
 [31 23 31 36 28 35 91 31 45 26 21]
 [32 39 56 25 46 52 28 44 32 21 55]
 [33 37 59 53 59 64 52 67 62 29 62]
 [34 74 67 59 93 77 47 40 66 17 73]
 [35 70 56 71 81 68 57 76 77 61 74]
 [36 35 47 27 29 33 50 30 60 26 24]
 [37 69 68 72 79 71 39 53 58 41 64]
 [38 33 46 33 43 31 24 37 34 38 63]
 [39 56 62 51 65 54 34 66 58 26 54]
 [40 58 64 70 59 67 54 69 57 56 49]
 [41 62 53 52 45 37 43 40 46 17 40]
 [42 19 25 21 32 36 65 38 22 51 33]
 [43 56 46 34 33 32 58 40 37 52 32]
 [44 62 75 85 74 65 58 76 89 63 68]
 [45 37 33 20 28 50 26 36 15 55 30]
 [46 44 46 59 50 28 62 53 38 28 53]
 [47 27 32 56 39 43 55 51 28 61 50]
 [48 36 46 49 54 31 75 43 40 30 49]
 [49 44 24 56 51 58 34 42 52 67 48]
 [50 71 75 64 84 58 25 67 65 47 56]]
               
Mean     
MCSE     
StdDev  ...  ESS_tail  ESS_bulk/s     R_hat
lp__    -1531.720000  0.301065    8.339540  ...   1521.21     250.589  1.000770
vF[1]      
0.939066  0.006721    0.306042  ...   2643.87     692.703  1.000350
vF[2]      
0.129547  0.006144    0.277600  ...   2710.55     682.873  1.001150
vF[3]      -0.500504  0.006295    0.285406  ...   2301.82     692.745  1.001450
vF[4]      
0.153873  0.005736    0.283963  ...   2812.10     823.800  1.000340
...             
...      
...        
...  ...       ...        
...      
...
L2V[8]      0.730895  0.001083    0.067019  ...   2841.38    1438.970  0.999558
L2V[9]      0.034613  0.000526    0.040602  ...   1840.98    1161.000  0.999896
L2V[10]     0.697676  0.001112    0.071477  ...   2969.85    1498.250  1.000020
v1       
115.490000  0.060979    4.727360  ...   3303.75    1984.820  0.999984
v2      
1414.130000  1.444690  109.619000  ...   3156.40    1940.710  1.001600
[678 rows x 11 columns]
Mu...
Mu[1]:  Q1 = 50.839,  Med = 51.827,  Q3 = 52.809
Mu[2]:  Q1 = 53.410,  Med = 54.230,  Q3 = 55.075
Mu[3]:  Q1 = 49.022,  Med = 50.182,  Q3 = 51.341
Mu[4]:  Q1 = 51.669,  Med = 52.650,  Q3 = 53.684
Mu[5]:  Q1 = 51.945,  Med = 52.880,  Q3 = 53.810
Mu[6]:  Q1 = 44.363,  Med = 46.127,  Q3 = 47.851
Mu[7]:  Q1 = 51.609,  Med = 52.545,  Q3 = 53.394
Mu[8]:  Q1 = 51.359,  Med = 52.254,  Q3 = 53.166
Mu[9]:  Q1 = 42.325,  Med = 43.729,  Q3 = 45.244
Mu[10]:  Q1 = 53.096,  Med = 54.045,  Q3 = 55.008
Sigma...
Sigma[1]:  Q1 = 9.662  Med = 10.413,  Q3 = 11.267
Sigma[2]:  Q1 = 8.234  Med = 8.965,  Q3 = 9.722
Sigma[3]:  Q1 = 10.973  Med = 11.850,  Q3 = 12.780
Sigma[4]:  Q1 = 9.872  Med = 10.732,  Q3 = 11.640
Sigma[5]:  Q1 = 9.246  Med = 10.013,  Q3 = 10.845
Sigma[6]:  Q1 = 16.298  Med = 17.502,  Q3 = 18.792
Sigma[7]:  Q1 = 8.617  Med = 9.285,  Q3 = 10.003
Sigma[8]:  Q1 = 8.574  Med = 9.355,  Q3 = 10.189
Sigma[9]:  Q1 = 14.553  Med = 15.615,  Q3 = 16.776
Sigma[10]:  Q1 = 9.413  Med = 10.278,  Q3 = 11.176
Lambda...
Lambda[1]:  Q1 = 11.977  Med = 12.989,  Q3 = 13.988  (Item_1)
Lambda[2]:  Q1 = 11.760  Med = 12.623,  Q3 = 13.474  (Item_2)
Lambda[3]:  Q1 = 11.578  Med = 12.731,  Q3 = 13.875  (Item_3)
Lambda[4]:  Q1 = 15.075  Med = 16.125,  Q3 = 17.156  (Item_4)
Lambda[5]:  Q1 = 12.270  Med = 13.290,  Q3 = 14.232  (Item_5)
Lambda[6]:  Q1 = 0.529  Med = 1.200,  Q3 = 2.254  (Item_6)
Lambda[7]:  Q1 = 11.370  Med = 12.247,  Q3 = 13.189  (Item_7)
Lambda[8]:  Q1 = 14.852  Med = 15.725,  Q3 = 16.579  (Item_8)
Lambda[9]:  Q1 = 1.102  Med = 2.249,  Q3 = 3.640  (Item_9)
Lambda[10]:  Q1 = 14.818  Med = 15.859,  Q3 = 16.855  (Item_10)
Lambda_j**/Var(X_j)...
Lambda[1]**2 / Var(X[1]):  Q1 = 0.549,  Med = 0.608,  Q3 = 0.662
Lambda[2]**2 / Var(X[2]):  Q1 = 0.613,  Med = 0.665,  Q3 = 0.712
Lambda[3]**2 / Var(X[3]):  Q1 = 0.473,  Med = 0.537,  Q3 = 0.592
Lambda[4]**2 / Var(X[4]):  Q1 = 0.642,  Med = 0.693,  Q3 = 0.738
Lambda[5]**2 / Var(X[5]):  Q1 = 0.581,  Med = 0.639,  Q3 = 0.687
Lambda[6]**2 / Var(X[6]):  Q1 = 0.001,  Med = 0.005,  Q3 = 0.016
Lambda[7]**2 / Var(X[7]):  Q1 = 0.581,  Med = 0.636,  Q3 = 0.685
Lambda[8]**2 / Var(X[8]):  Q1 = 0.693,  Med = 0.739,  Q3 = 0.778
Lambda[9]**2 / Var(X[9]):  Q1 = 0.005,  Med = 0.020,  Q3 = 0.050
Lambda[10]**2 / Var(X[10]):  Q1 = 0.655,  Med = 0.706,  Q3 = 0.750
        
Q1 = 0.898,  Med =
0.904,  Q3 = 0.911
まず、入力データが出力されている。
続いて、MCMCサンプリングの統計が出力されている。
事後分布などのグラフで表示されていた情報が、統計の数値データとして読むことができる。
図A4(
)、図A5(
)における他とは著しく異なる項目は、上の統計量から6番目と9番目の項目であることが解る。6番目と9番目を除いて再分析を行う。
図A1のデータから、6番目と9番目の項目のデータを除いたものを、図B1に示すように用意した。

図B1 図A1のデータから6番目と9番目のデータを抜いたもの
図B1のデータに対して、リスト2のスクリプトを実行した。
(stan) *****/estomegafiles$ python
EstOmega.py
Output file (*.txt) = Results_69.txt
Input Excel data file (*.xlsx) =
Data_69.xlsx
出力ファイル名をResults_69.txtとした。上の分析の場合と同じ名前でもよいが、同じ名前にすると、ファイルは上書きされて、古いファイルの内容は消される。
入力データファイル名は、図B1のファイルである。
実行すると、
の事後分布は、図B2のようである。

図B2
図B2のWindowを閉じると、
の事後分布が表示される(図B3)。

図B3
図B3のWindowを閉じると、
の事後分布のグラフが表示される(図B4)。

図B4
図B4のWindowを閉じると、
の事後分布のグラフが表示される(図B5)。

図B5
図B5のWindowを閉じると、ωの事後分布のグラフが表示される(図B6)。図A6のものより右に寄っていることが分かる。

図B6
図B6のWindowを閉じると、点
の散布図が表示される(図B7)。図A7のものより、点が狭い帯内にまとまっていることが分かる。

図B7
図B7のWindowを閉じると、スクリプトの実行終了である。
端末には以下のようなメッセージが表示されている。
omega:  Q1 = 0.931,  Med = 0.936,  Q3 = 0.941
Results_69.txt was saved.
(stan) *****/estomegafiles$
出力ファイルResults_69.txtを開くと、以下のようになっている。
Input data file = Data_69.xlsx
data...
[[ 1 79 46 68 65 89 58 70 65]
 [ 2 48 71 61 50 43 48 54 61]
 [ 3 38 42 38 45 55 47 39 54]
 [ 4 45 51 30 71 63 62 58 51]
 [ 5 74 54 47 60 44 66 80 54]
 [ 6 63 66 58 62 74 75 74 67]
 [ 7 65 65 61 52 62 64 60 64]
 [ 8 72 85 89 82 75 76 73 82]
 [ 9 31 34 27 39 40 25 27 26]
 [10 62 78 45 61 60 47 39 48]
 [11 61 51 22 67 29 38 56 44]
 [12 28 31 28 18 30 34 32 44]
 [13 60 75 60 64 64 46 72 64]
 [14 60 62 63 40 63 45 65 82]
 [15 67 61 66 66 79 80 71 89]
 [16 55 33 45 24 35 36 26 26]
 [17 44 51 40 28 45 59 32 35]
 [18 64 71 40 46 46 76 75 72]
 [19 25 41 27 36 37 29 19 40]
 [20 56 47 41 32 50 41 45 22]
 [21 41 49 78 53 41 56 39 40]
 [22 62 64 49 49 60 59 51 64]
 [23 60 55 65 50 48 54 53 57]
 [24 48 64 63 41 50 54 63 70]
 [25 73 76 51 71 72 81 66 94]
 [26 71 67 59 85 87 66 80 83]
 [27 69 56 48 35 50 42 53 48]
 [28 54 53 47 69 53 65 59 59]
 [29 47 72 68 83 77 61 71 81]
 [30 16 30 32 16 34 36 30 18]
 [31 23 31 36 28 35 31 45 21]
 [32 39 56 25 46 52 44 32 55]
 [33 37 59 53 59 64 67 62 62]
 [34 74 67 59 93 77 40 66 73]
 [35 70 56 71 81 68 76 77 74]
 [36 35 47 27 29 33 30 60 24]
 [37 69 68 72 79 71 53 58 64]
 [38 33 46 33 43 31 37 34 63]
 [39 56 62 51 65 54 66 58 54]
 [40 58 64 70 59 67 69 57 49]
 [41 62 53 52 45 37 40 46 40]
 [42 19 25 21 32 36 38 22 33]
 [43 56 46 34 33 32 40 37 32]
 [44 62 75 85 74 65 76 89 68]
 [45 37 33 20 28 50 36 15 30]
 [46 44 46 59 50 28 53 38 53]
 [47 27 32 56 39 43 51 28 50]
 [48 36 46 49 54 31 43 40 49]
 [49 44 24 56 51 58 42 52 48]
 [50 71 75 64 84 58 67 65 56]]
              
Mean     
MCSE    
StdDev  ...  ESS_tail  ESS_bulk/s    R_hat
lp__   -1188.020000  0.316133   8.132270  ...   1198.04     245.409  1.00504
vF[1]      0.931394  0.006707   0.303334  ...   2479.93     774.468  1.00027
vF[2]      0.133307  0.006507   0.283712  ...   2312.85     734.531  1.00097
vF[3]     -0.514093  0.006231   0.280542  ...   2793.45     776.290  1.00060
vF[4]      0.160360  0.006567   0.287864  ...   2258.66     736.626  1.00074
...            
...      
...       
...  ...       ...        
...     
...
L2V[6]     0.630956  0.001414   0.080581  ...   2934.79    1405.170  1.00063
L2V[7]     0.729854  0.001136   0.066082  ...   2898.76    1309.020  1.00135
L2V[8]     0.698674  0.001262   0.072172  ...   2638.18    1336.090  1.00028
v1      
111.462000  0.060987   4.223700  ...   3378.10    1843.830  1.00211
v2      
848.904000  1.146130  71.037400  ...   3049.17    1445.850  1.00066
[564 rows x 11 columns]
Mu...
Mu[1]:  Q1 = 50.789,  Med = 51.797,  Q3 = 52.785
Mu[2]:  Q1 = 53.426,  Med = 54.263,  Q3 = 55.100
Mu[3]:  Q1 = 49.061,  Med = 50.175,  Q3 = 51.338
Mu[4]:  Q1 = 51.633,  Med = 52.634,  Q3 = 53.634
Mu[5]:  Q1 = 51.957,  Med = 52.907,  Q3 = 53.889
Mu[6]:  Q1 = 51.613,  Med = 52.475,  Q3 = 53.338
Mu[7]:  Q1 = 51.422,  Med = 52.256,  Q3 = 53.105
Mu[8]:  Q1 = 53.094,  Med = 54.016,  Q3 = 54.970
Sigma...
Sigma[1]:  Q1 = 9.633  Med = 10.400,  Q3 = 11.236
Sigma[2]:  Q1 = 8.242  Med = 8.957,  Q3 = 9.694
Sigma[3]:  Q1 = 11.022  Med = 11.863,  Q3 = 12.800
Sigma[4]:  Q1 = 9.847  Med = 10.686,  Q3 = 11.612
Sigma[5]:  Q1 = 9.274  Med = 10.024,  Q3 = 10.868
Sigma[6]:  Q1 = 8.568  Med = 9.242,  Q3 = 9.980
Sigma[7]:  Q1 = 8.626  Med = 9.399,  Q3 = 10.249
Sigma[8]:  Q1 = 9.368  Med = 10.211,  Q3 = 11.103
Lambda...
Lambda[1]:  Q1 = 12.015  Med = 12.991,  Q3 = 14.034  (Item_1)
Lambda[2]:  Q1 = 11.769  Med = 12.651,  Q3 = 13.508  (Item_2)
Lambda[3]:  Q1 = 11.545  Med = 12.702,  Q3 = 13.881  (Item_3)
Lambda[4]:  Q1 = 15.021  Med = 16.112,  Q3 = 17.138  (Item_4)
Lambda[5]:  Q1 = 12.249  Med = 13.271,  Q3 = 14.253  (Item_5)
Lambda[6]:  Q1 = 11.374  Med = 12.282,  Q3 = 13.174  (Item_7)
Lambda[7]:  Q1 = 14.786  Med = 15.757,  Q3 = 16.682  (Item_8)
Lambda[8]:  Q1 = 14.787  Med = 15.816,  Q3 = 16.862  (Item_10)
Lambda_j**/Var(X_j)...
Lambda[1]**2 / Var(X[1]):  Q1 = 0.551,  Med = 0.610,  Q3 = 0.662
Lambda[2]**2 / Var(X[2]):  Q1 = 0.613,  Med = 0.666,  Q3 = 0.714
Lambda[3]**2 / Var(X[3]):  Q1 = 0.470,  Med = 0.534,  Q3 = 0.591
Lambda[4]**2 / Var(X[4]):  Q1 = 0.642,  Med = 0.695,  Q3 = 0.740
Lambda[5]**2 / Var(X[5]):  Q1 = 0.576,  Med = 0.636,  Q3 = 0.687
Lambda[6]**2 / Var(X[6]):  Q1 = 0.583,  Med = 0.639,  Q3 = 0.689
Lambda[7]**2 / Var(X[7]):  Q1 = 0.691,  Med = 0.737,  Q3 = 0.777
Lambda[8]**2 / Var(X[8]):  Q1 = 0.657,  Med = 0.706,  Q3 = 0.750
omega...
        
Q1 = 0.931,  Med =
0.936,  Q3 = 0.941
他と特に互いに異なる値の項目は認められない。ωの値も高くなっており
10項目のときの
omega...
        
Q1 = 0.898,  Med =
0.904,  Q3 = 0.911
から、第6項目と第9項目を抜いた8項目でのωは
omega...
        
Q1 = 0.931,  Med =
0.936,  Q3 = 0.941
であり、四分位数の比較でも8項目に減らしたときのωの方が高い値であると言えよう。
リスト1 MCMCサンプリングのためのStanスクリプト(est_omega.stan)
//
//         
Yasuharu Okamoto, 2023.08, 2025.03
//
data {
    int N;
    int M;
    array[N,M] real X;
    vector[M] i_mu;
    vector[M] i_std;
}
parameters {
    vector[N] vF;
    vector[M] v_mu;
    vector<lower=0.0>[M]
v_Lmbd;
    vector<lower=0.0>[M]
v_sgm;
}
transformed parameters {
    vector[N] F;
    real sumF;
    real ssF;
    real meanF;
    real sdF;
    vector[M] mu;
    vector[M] Lmbd;
    vector[M] sgm;
    array[N] vector[M] V;
    //
    //       
Standardized F values
    //
    sumF = 0.0;
    ssF = 0.0;
    for (i in 1:N) {
        sumF
+= vF[i];
        ssF
+= pow(vF[i], 2);
    }
    meanF = sumF / N;
    sdF = pow((ssF - N *
pow(meanF, 2)) / (N - 1), 0.5);
    F = (vF - meanF) / sdF;       //  標準化
    //
    //         
Rescaled parameters
    //
    mu = i_mu + 10.0 .* i_std .*
v_mu;
    Lmbd = 10.0 .* i_std .*
v_Lmbd;
    sgm = 0.001 + 10.0 .* i_std
.* v_sgm;
    //
    //          Regression
model
    //
    for (i in 1:N)
        V[i]
= mu + Lmbd * F[i];
}
model {
    vF ~ normal(0.0, 1.0);
    v_mu ~ normal(0.0, 10.0);
    v_Lmbd ~ exponential(0.1);
    v_sgm ~ exponential(0.1);
    for (i in 1:N)
        X[i]
~ normal(V[i], sgm);
}
generated quantities {
    real omg;              
//  omega
    vector[M] L2V;
    real v1;
    real v2;
    v1 = 0.0;
    v2 = 0.0;
    L2V = pow(Lmbd, 2.0) ./
(pow(Lmbd, 2.0) + pow(sgm, 2.0));
    for (j in 1:M) {
        v1
+= Lmbd[j];
        v2 += pow(sgm[j], 2);
    }
    omg = pow(v1, 2) / (pow(v1,
2) + v2);
}
リスト2 リスト1のStanスクリプトを用いるPythonスクリプト(EstOmega.py)
from cmdstanpy import CmdStanModel
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
foutnm = input("Output file
(*.txt) = ") 
fout = open(foutnm, 'w')   
#
#       Excelデータファイルの読み込み
#
s = input("Input Excel data file
(*.xlsx) = ")
xlsx_fl = pd.ExcelFile(s)
data_xlsx = pd.read_excel(xlsx_fl)
var_names = [v for v in
data_xlsx.keys()][1:]
print('var_names =', var_names)
data = data_xlsx.values
print('data...\n', data)
fout.write(f'Input data file = {s}\n')
fout.write(f'\ndata...\n{data}\n')
X = data[:,1:]
mus = np.mean(X, axis=0)
stds = np.std(X, axis=0)
Data = {'N': len(X), 'M': len(X[0]),
'X': X, 'i_mu': mus, 'i_std': stds}
model =
CmdStanModel(stan_file="est_omega.stan")    #   コンパイル
fit = model.sample(data=Data)                      
#   サンプリング
print(fit.summary())
fout.write('\n{}'.format(fit.summary()))
df = fit.draws_pd()          
print()
fout.write('\n\nMu...\n')
for j in range(len(X[0])):
    q1, med, q3 =
np.percentile(df[f'mu[{j+1}]'], [25, 50, 75])
    print(f'Mu[{j+1}]:', end =
'')
    print(f'  Q1 = {q1:.3f},  Med = {med:.3f},  Q3 = {q3:.3f}')
    fout.write(f'Mu[{j+1}]:  Q1 = {q1:.3f},  Med = {med:.3f},  Q3 = {q3:.3f}\n')
mus = np.mean(X, axis=0)
stds = np.std(X, axis=0)
#
#        muの事後分布
#
for j in range(len(X[0])):
    sb.kdeplot(df[f'mu[{j+1}]'],
label=f'{var_names[j]}')
plt.title(r'$\mu$', fontsize = 16)
plt.xlabel('')
plt.legend(bbox_to_anchor=(1.0, 1.0))
plt.tight_layout()
plt.show()
#
#       
Sigmaの4分位数の計算
#
print()
fout.write('\nSigma...\n')
for j in range(len(X[0])):
    q1, med, q3 =
np.percentile(df[f'sgm[{j+1}]'], [25, 50, 75])
    print(fr'Sigma[{j+1}]:', end
= '')
    print(f'  Q1 = {q1:.3f},  Med = {med:.3f},  Q3 = {q3:.3f}')
   
fout.write(f'Sigma[{j+1}]: 
Q1 = {q1:.3f}' +
              
f'  Med = {med:.3f},  Q3 = {q3:.3f}\n')
#
#       
Sigmaの事後分布
#
for j in range(len(X[0])):
   
sb.kdeplot(df[f'sgm[{j+1}]'], label=f'{var_names[j]}')
plt.title(r'$\sigma$', fontsize = 16)
plt.xlabel('')
plt.legend(bbox_to_anchor=(1.0, 1.0))
plt.tight_layout()
plt.show()
#
#       Lambdaの四分位数の計算
#
print()
fout.write('\nLambda...\n')
for j in range(len(X[0])):
    q1, med, q3 =
np.percentile(df[f'Lmbd[{j+1}]'], [25, 50, 75])
    print(fr'Lambda[{j+1}]:',
end = '')
    print(f'  Q1 = {q1:.3f},  Med = {med:.3f},  Q3 = {q3:.3f}', end = '')
    print(f'  ({var_names[j]})')
   
fout.write(f'Lambda[{j+1}]: 
Q1 = {q1:.3f}' +
              
f'  Med = {med:.3f},  Q3 = {q3:.3f}' +
              
f'  ({var_names[j]})\n')
#
#       Lambdaの事後分布
#
for j in range(len(X[0])):
   
sb.kdeplot(df[f'Lmbd[{j+1}]'], label=f'{var_names[j]}')
plt.title(r'$\lambda$', fontsize = 16)
plt.xlabel('')
plt.legend(bbox_to_anchor=(1.0, 1.0))
plt.tight_layout()
plt.savefig('FigLmbd.png')
plt.show()
#
#          
真値の割合の計算
#
print()
fout.write('\nLambda_j**/Var(X_j)...\n')
for j in range(len(X[0])):
    q1, med, q3 =
np.percentile(df[f'L2V[{j+1}]'], [25, 50, 75])
    print(f'Lambda[{j+1}]**2 /
Var(X[{j+1}]):', end = '')
    print(f'  Q1 = {q1:.3f},  Med = {med:.3f},  Q3 = {q3:.3f}')
   
fout.write(f'Lambda[{j+1}]**2 / Var(X[{j+1}]):' +
              
f'  Q1 = {q1:.3f},  Med = {med:.3f},  Q3 = {q3:.3f}\n')
for j in range(len(X[0])):
   
sb.kdeplot(df[f'L2V[{j+1}]'], label=f'{var_names[j]}')
plt.title(r'$\lambda^{2}_{j}/Var(X_{j})$',
fontsize = 16)
plt.xlabel('')
plt.legend(bbox_to_anchor=(1.0, 1.0))
plt.tight_layout()
plt.show()
#
#           
Omegaの四分位数の計算
#
print()
q1, med, q3 =
np.percentile(df[f'omg'], [25, 50, 75])
print(f'omega:  Q1 = {q1:.3f},  Med = {med:.3f},  Q3 = {q3:.3f}')
fout.write('\nomega...\n')
fout.write(f'        
Q1 = {q1:.3f},  Med =
{med:.3f},  Q3 = {q3:.3f}\n')
#
#          
Omegaの事後分布
#
sb.kdeplot(df['omg'])
plt.title(f'Q1 = {q1:.3f},  Med = {med:.3f},  Q3 = {q3:.3f}', fontsize = 14)
plt.xlabel(r'$\omega$', fontsize = 16)
plt.tight_layout()
plt.show()
#
#       (因子得点F、尺度得点和)の散布図
#
sumXs = np.sum(X, axis = 1)
Fs = []
for i in range(len(X)):
   
Fs.append(np.median(df[f'F[{i+1}]']))
plt.plot(Fs, sumXs, 'o')
plt.xlabel(r'$\widehat{F}_{median}$',
fontsize = 14)
plt.ylabel(r'$\sum{X_{j}}$', fontsize
= 14)
plt.tight_layout()
plt.show()
             
fout.close()
print(foutnm, 'was saved.\n')
Gelman, A., Hill, J., & Vehtari, A. (2021). Regression and Other Stories. Cambridge University Press.
McDonald, R. P. (1999). Test Theory: A unified treatment. Psychology Press.
岡本安晴(2014)、心理学データ分析と測定.勁草書房