Извините, я недостаточно образован, чтобы догнать ваши цели по проверке эффективности корреляции между двумя ковариационными матрицами, но я попытался понять ваш код как таковой.
Если я прав, вы составляете 10.000 различных матриц из одной и той же матрицы (mat2
), переупорядочивая ячейки по кругу и повторно вычисляя корреляцию между ковариационной матрицей mat1
и ковариационной матрицей пересэмплированной массив. Они хранятся в переменной statSim
.
Вы сказали, что исходный эффективный эффект корреляции был высоким (statObs
), но максимум statSim
был низким, что странно. Я думаю, что проблема с вашим списком результатов:
list( obs = statObs , sumFit = sum(statSim > statObs)/numR)
Где вы возвращаете исходный коэффициент корреляции (obs
), но не записанный максимум с sumFit
. Там вы можете использовать, например. max(statSim)
. Я вижу смысл возвращать sumFit
для проверки того, принесло ли изменение выборки какое-либо улучшение эффективности корреляции, но, основываясь на вашем коде, я не вижу проблем в теории.
Обновлена функция с max
моделируемых коэффициентов корреляции:
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, max=max(statSim))
}
Что я пробежал:
> mat1 <- matrix(runif(25),5,5)
> mat2 <- mat1+0.2
> resamplerSimAlt(mat1, mat2, 10000)
$obs
[1] 1
$sumFit
[1] 0
$max
[1] 0.94463
И со случайным mat2
:
> mat2 <- matrix(runif(25),5,5)
> resamplerSimAlt(mat1, mat2, 10000)
$obs
[1] 0.31144
$sumFit
[1] 0.9124
$max
[1] 0.9231
Мой ответ может быть не реальным. Если это так, пожалуйста, дайте более подробную информацию о проблеме:)