正確なデータを生成するには?
R では、特定の特性 (平均 = 0、sd = 1 など) を持つ母集団からサンプリングするために使用するオプションがありますが、正確にrnorm
平均 = 0、sd = 1 のデータを取得するにはどうすればよいでしょうか?
これは簡単な例です。また、正確なデータを取得する方法を適用するより一般的な方法にも興味があります (たとえば、正確な相関が 0.2 の多変量データ)。
データを単純に再スケーリングできます。
n <- 100
x <- rnorm(n)
x <- ( x - mean(x) ) / sd(x)
mean(x) # 0, up to machine precision
sd(x) # 1
ppoints
等間隔のポイントを使用することもできます (ただし、再スケーリングする必要があります)。
x <- qnorm( ppoints(n) )
x <- ( x - mean(x) ) / sd(x)
mean(x)
sd(x)
高次元では、変換は少しトリッキーです。x
がガウス ベクトルで、平均が 0 で分散が単位行列の場合、 は平均が 0 で分散が行列 のガウスベクトルC %*% x
ですV = CC'
。
C
のコレスキー変換ですV
。これは、(対称、半正定値) 行列の平方根の類似物と見なすことができます。
実際には、これらの変換のうち 2 つが必要です。1 つ目は分散を ID に設定するためのもので、2 つ目はそれを目的の値に設定するためのものです。
# Desired variance matrix
V <- matrix( c(1,.2,.2, .2,1,.2, .2,.2,1), 3, 3 )
# Random data
n <- 100
k <- 3
x <- matrix( rnorm(k*n), nc=3 )
# Set the mean to 0, and the variance to the identity
x <- t( t(x) - colMeans(x) )
colMeans(x) # 0
C1 <- chol(var(x))
x <- x %*% solve(C1)
var(x) # identity matrix
# Set the variance to the desired value
C2 <- chol(V)
x <- x %*% C2
var(x) - V # zero