- n個の正規乱数が、平均はすべて0で、covariance matrix に従って得られるとき、地道に自分で作れば、適当な正の正方行列を作って、その固有値分解をして正規直交基底方向の拡大縮小成分と回転成分とに分けておき、多次元標準正規乱数から拡大縮小と回転とをさせることで作成できる
- やってみよう
n <- 4
library(GPArotation)
V <- Random.Start(n)
S <- diag(runif(n)*5)
sigma <- V%*%S%*%t(V)
eigen.out <- eigen(sigma)
eigen.out[[1]]
n.set <- 1000
X <- matrix(rnorm(n.set*n),ncol=n)
X. <- t(t(X) * sqrt(eigen.out[[1]]))
X.. <- t(eigen.out[[2]] %*% t(X.))
plot(as.data.frame(X..),xlim=range(X..),ylim=range(X..))
library(mvtnorm)
x <- rmvnorm(n=n.set, mean=rep(0,n), sigma=sigma)
colMeans(x)
colMeans(X..)
var(x)
var(X..)
x <- rmvnorm(n=n.set, mean=rep(0,n), sigma=sigma, method="chol")
colMeans(x)
var(x)
- このような乱数に、相互に独立した観測誤差を入れる
- 相互に共分散行列で関係付いた乱数は回転してやれば相互に独立した正規乱数として扱えるし、その回転において、観測誤差の間には関連が発生しないことを利用して、以下のようにして、観測結果から条件付期待値を算出してやることができる
- やってみよう。上段は真値を横軸に、観測値・期待値とを縦軸にとった。下段は観測値を横軸に、真値・期待値を縦軸にとった。n個の乱数のうち3個を示したが、いずれも、真値~観測値の回帰直線と、条件付期待値との重なりがよいことが示されている
n <- 4
library(GPArotation)
V <- Random.Start(n)
S <- diag(runif(n)*5)
sigma <- V%*%S%*%t(V)
eigen.out <- eigen(sigma)
eigen.out[[1]]
n.set <- 500
X <- matrix(rnorm(n.set*n),ncol=n)
X. <- t(t(X) * sqrt(eigen.out[[1]]))
X.. <- t(eigen.out[[2]] %*% t(X.))
plot(as.data.frame(X..),xlim=range(X..),ylim=range(X..))
X <- X..
s <- 1
Z <- rnorm(length(X..),0,s)
Y <- X + Z
とすることなので、結局、固有値をその比で調整することが多変量化に相当する
X. <- t(eigen.out[[2]] %*% diag(eigen.out[[1]]/(eigen.out[[1]]+s^2)) %*% t(eigen.out[[2]]) %*% t(Y))
par(mfcol=c(2,3))
for(i in 1:3){
plot(X[,i],Y[,i],pch=20,xlab="真値",ylab="観測値・期待値")
points(X[,i],X.[,i],pch=20,col=2)
abline(0,1,col=3)
lm.out <- lm(Y[,i]~X[,i])
lm.out
abline(lm.out[[1]][1],lm.out[[1]][2],col=4)
plot(Y[,i],X[,i],pch=20,xlab="観測値",ylab="真値・期待値")
points(Y[,i],X.[,i],pch=20,col=2)
abline(0,1,col=3)
lm.out2 <- lm(X[,i]~Y[,i])
lm.out2
abline(lm.out2[[1]][1],lm.out2[[1]][2],col=4)
}
par(mfcol=c(1,1))