Относительная дисперсия (векторизованная реализация) в R - PullRequest
0 голосов
/ 02 мая 2018

Скажите, что у меня есть (n x m) матрица в r. Вот воспроизводимый пример.

values <- matrix(rexp(440, rate=.1), ncol=44)

Я бы хотел вычислить относительную дисперсию ниже. По сути, я хотел бы вычислить это

enter image description here

Это должно вернуть матрицу (1 x m). Одно вычисление в первом столбце будет примерно таким:

sum((values[10,9] / values[9,9])^2 / length(values[,1]))

Я пытался зациклить это как

  for (i in 2 : length(values)) {
    values_new <- sum((values[i,i-1] / values[i-1,i-1])) ^ 2 / 10
  }

Я не уверен, что делать с циклом или векторизованной реализацией. Ценю твою помощь.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Просто сделайте:

colMeans((values[-1, ] / values[-nrow(values), ]) ^ 2)

Матричные манипуляции / операции в R полностью векторизованы.

Приведенный выше код разделит все значения (кроме первой строки) на все значения (кроме последней строки), поместит все в степень 2 и затем вычислит среднее значение столбцов (обратите внимание, что, поскольку мы получаем nrow(values) - 1 строк на столбец, мы можем просто рассчитать среднее значение столбца).

0 голосов
/ 02 мая 2018

Возможно, вы захотите попробовать векторизованную версию для каждого столбца и использовать применить для просмотра всех столбцов. Вот пример:

apply(values, 2, function(x){
  z <- x[2:length(x)]
  g <- x[1:(length(x)-1)]
  return(sum((z/g)^2)/(length(x)-1))
})

Объяснение:

z совпадает с x без первого элемента
g совпадает с x без последнего элемента

z/g[1] совпадает с x[2]/x[1] и т. Д. Другими словами, для первого столбца:

sum((values[2:10,1]/values[1:9,1])^2)/(length(values[,1])-1)

apply проходит по матрице столбец за столбцом (поскольку второй аргумент MARGIN был установлен на 2) и выполняет функцию. Выполняемая здесь функция является анонимной (определяется на месте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...