Разница в расчете дисперсии - PullRequest
0 голосов
/ 12 апреля 2020

Я вручную вычислил дисперсию двух наборов данных с использованием выражений определения, вычисления и нормального R.

 set.seed(12345)                        
 n <- 1e7                             
 df <- tibble(
   small = rnorm(n, mean=100, sd=1),
   large = rnorm(n, mean=1e8, sd=1)
 )

#Definitional
varFuncd <- function(x) {
  x <- as.numeric(as.character(x))[!is.na(as.numeric(as.character(x)))] 
  sum((x-mean(x))^2) / (length(x)-1)
}

#Computational 
varFuncc <- function(x){
  x <- as.numeric(as.character(x))[!is.na(as.numeric(as.character(x)))]
  (sum(x^2) - (sum(x)^2)/length(x))/(length(x)-1)
}

, но дисперсия столбца Large дает ожидаемый большой результат (1.6). Пожалуйста, в чем может быть причина?

Мой ответ:

Все определения выражений выдали ожидаемую дисперсию 1. Однако вычислительное выражение для «Large» вызвало более высокую дисперсию. Определительное выражение производит квадрат разности, что переводит в квадрат относительно небольших значений и дает более эффективные результаты. Хотя в вычислениях используется разность квадратов, когда лежащие в основе значения велики, разность квадратов дает менее эффективный результат, поскольку возведение в квадрат больших чисел приводит к появлению сверхбольших чисел, которые становятся неэффективными при делении на n-1.

1 Ответ

1 голос
/ 12 апреля 2020

Я согласен, что у вас проблемы с числовой стабильностью, поскольку R использует двойные числа с плавающей точкой для numeric. Из Википедии при обсуждении указанного c представления для дисперсии, которое вы используете для varFuncc:

Это уравнение не следует использовать для вычислений с плавающей запятой арифметика c, поскольку она страдает от катастрофы c отмены , если две составляющие уравнения имеют одинаковую величину. Существуют численно устойчивые альтернативы.

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