私の意図は、2 つの共分散行列間の全体的な類似性を見つけることを目的としたいくつかの関数を作成することでした。これには、それらをランダムなベクトルで乗算して応答ベクトルを相関させるか、行列の 1 つをブートストラップして比較に役立つ相関係数分布を取得することによって行います。しかし、どちらの場合も、誤った結果が得られました。観測されたマトリックス間の相関は 0.93 まで高かったが、分布は最大 0.2 までしか範囲がなかった。これは関数のコードです:
resamplerSimAlt <- function(mat1, mat2, numR, graph = FALSE)
{
statSim <- numeric(numR)
mat1vcv <- cov(mat1)
mat2vcvT <- cov(mat2)
ltM1 <- mat1vcv[col(mat1vcv) <= row(mat1vcv)]
ltM2T <- mat2vcvT[col(mat2vcvT) <= row(mat2vcvT)]
statObs <- cor(ltM1, ltM2T)
indice <- c(1:length(mat2))
resamplesIndices <- lapply(1:numR, function(i) sample(indice, replace = F))
for (i in 1:numR)
{
ss <- mat2[sample(resamplesIndices[[i]])]
ss <- matrix(ss, nrow = dim(mat2)[[1]], ncol = dim(mat2)[[2]])
mat2ss <- cov(ss)
ltM2ss <- mat2ss[col(mat2ss) <= row(mat2ss)]
statSim[i] <- cor(ltM1, ltM2ss)
}
if (graph == TRUE)
{
plot(1, main = "resampled data density distribution", xlim = c(0, statObs+0.1), ylim = c(0,14))
points(density(statSim), type="l", lwd=2)
abline(v = statObs)
text(10, 10, "observed corelation = ")
}
list( obs = statObs , sumFit = sum(statSim > statObs)/numR)
}
実際、2 つの元のマトリックス間の相関係数が高く、1 番目の元のマトリックスと 2 番目の再サンプリングされたマトリックスの間の相関係数が、10000 回のブートストラップ反復後に最大 0.2 であるとは信じがたいです。
コードの有効性に関するコメントはありますか?