Корреляция переменных начальной загрузки в R - PullRequest
3 голосов
/ 13 октября 2011

Я намеревался написать несколько функций, направленных на поиск общего сходства между двумя ковариационными матрицами, либо умножив их на случайные векторы и сопоставив векторы откликов, либо загрузив одну из матриц для получения распределения коэффициента корреляции, которое можетсравнение.Но в обоих случаях я получил ошибочные результаты.Наблюдаемая межматричная корреляция была высокой до 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)
}  

На самом деле мне трудно поверить, что коэффициент корреляции между двумя исходными матрицами высок, а коэффициент между первой исходной матрицей и второй повторно выбранодин максимальный 0,2 после 10000 повторений начальной загрузки.

Есть ли какие-либо комментарии относительно действительности кода?

1 Ответ

1 голос
/ 23 октября 2011

Извините, я недостаточно образован, чтобы догнать ваши цели по проверке эффективности корреляции между двумя ковариационными матрицами, но я попытался понять ваш код как таковой.

Если я прав, вы составляете 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

Мой ответ может быть не реальным. Если это так, пожалуйста, дайте более подробную информацию о проблеме:)

...