コンピュータ(統計解析ソフトウェア)を活用して統計学の勉強をしていると、特定の平均値、分散を持つ一変量データとか、特定の相関係数を持つ二変量データを生成できないかなと思うことはありませんでしたか?...って、ないでしょうね、ふつうは (^_^;)
二変数間の相関係数 r というのは、全体が unit 数の要素で規定されると仮定すれば、二変数の共通部分が unit × r であるということです。主成分分析(因子分析)の結果を解釈するときにこの考え方が理解できます。
相関係数というのは、このようにも説明することができるんですね〜
具体的にいえば、例えば身長と体重の相関係数が 0.4 であるとき、身長と体重を決定する要因が 100 種類あるとすると、身長と体重にともに関与する要因は 40、身長および体重に関与する要因は 60 個ずつあり、それは互いに異なるということです。
以下のスクリプトでは、"近似的に" 指定された相関係数を持つ人工データを生成します。
なお、位置および散布度の調整には対応していません。
もう少し解析的にテストデータを生成するには、主成分分析のときに主成分得点をどうやって求めるかということの逆を考えればいいわけです。つまり、構造ベクトルあるいは相関係数行列からデータ行列を生成ればいいわけです。
# gendata.awk BEGIN { # 以下の二項目を指定する r = 0.95 # 生成する二変数が持つべき相関係数 n = 1000 # 生成するデータ数 #以下の一項目の指定はオプション unit = 50 # 小さすぎると不正確、大きすぎると時間がかかる #正規乱数生成 a = int(unit*r) # 共通部分のユニット数 b = unit-a # 独自部分のユニット数 for (i = 1; i <= n; i++) { c = add(a) # 共通部分 x = c+add(b) # 共通部分 + x の独自部分 y = c+add(b) # 共通部分 + y の独自部分 print x, y } } function add(n, i, x) #n 個の一様乱数を加算する { x = 0 for (i = 1; i <= n; i++) { x += rand() } return x }