特定の相関係数行列を持つ多変量データの生成     Last modified: Aug 28, 2004

目的

特定の相関係数行列を持つ多変量データを生成する
(2変数データの場合は別のプログラムが便利)
MASSパッケージのmvrnorm関数でもできる

使用法

gendat(nc, r)

引数

nc	標本サイズ
r	相関係数行列

ソース

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/gendat.R", encoding="euc-jp")

# 特定の相関係数行列を持つ多変量データの生成
gendat <- function(  nc,                     # 標本サイズ
                        r)                      # 相関係数行列
{
        nv <- ncol(r)                                # 変数の個数
        z <- matrix(rnorm(nv*nc), ncol=nv)   # 仮のデータ行列を作る。この時点では変数間の相関は近似的に0である。
        r2 <- cor(z)                         # 相関係数行列
        res <- eigen(r2)                     # 主成分分析を行い,
        coeff <-  solve(r2) %*% (sqrt(matrix(res$values, nv, nv, byrow=TRUE))*res$vectors)
        z <- t((t(z)-colMeans(z))/sqrt(apply(z, 2, var)*(nc-1)/nc)) %*% coeff        #主成分得点を求める。この時点で変数間の相関は完全に0である。
        return(z %*% chol(r))                   # コレスキー分解の結果をもとに,指定された相関係数行列 を持つように主成分得点を変換する。
}


使用例

> nc <- 20
> z <- gendat(nc, matrix(c(1, 0.512, 0.335, 0.512, 1, 0.467, 0.335, 0.467, 1), ncol=3))
> z
       
        [,1]        [,2]       [,3]
   [1,]  2.21372763  0.90455236  1.5240454	# 生成されたデータ
   [2,] -0.45080094 -0.20986473  1.1174826
   [3,]  1.58487436 -1.06265744 -2.4285410
   [4,] -0.89568378 -1.13208582  0.3310756
   [5,]  1.36158887  0.84001818  1.7386909
   [6,]  0.39734615  1.04088405 -0.3364469
   [7,] -0.09416335 -0.20762585  1.0393830
   [8,] -1.22196036 -0.32578442 -0.6404094
   [9,] -0.84784564  0.08392657 -1.0298539
  [10,]  0.40092062  2.41337574  0.8425117
  [11,] -0.11916023  0.91027540 -0.6517597
  [12,] -1.27008358 -1.18811412 -0.2987666
  [13,] -2.18499030 -2.12059485 -1.6036881
  [14,]  0.64360886  0.01130282  0.1029740
  [15,]  0.34426143 -0.40514536  0.3413435
  [16,]  0.16459256  0.84058950  0.2445198
  [17,] -0.13113523  0.85887443 -0.2626515
  [18,]  0.33154003 -0.20170670 -0.4962152
  [19,] -0.30637310 -0.42684850  0.6376739
  [20,]  0.07973601 -0.62337127 -0.1713677

> apply(z, 2, mean)	# 平均値が 0 であることの確認
[1] -1.457168e-17 -8.326673e-17  1.387779e-18

> sqrt(apply(z, 2, var)*(nc-1)/nc)	# 標準偏差が 1 であることの確認
[1] 1 1 1

> cor(z)	# 指定した相関係数行列であることの確認
      [,1]  [,2]  [,3]
[1,] 1.000 0.512 0.335
[2,] 0.512 1.000 0.467
[3,] 0.335 0.467 1.000


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh