Я пытаюсь понять, как рассчитать стандартное отклонение набора данных, когда у меня есть пара стандартных отклонений. Давайте просто посмотрим на этот MWE:
set.seed(1234)
dummy_data <- data.frame(
"col_1" = sample(1:7, size = 10, replace = TRUE),
"col_2" = sample(1:7, size = 10, replace = TRUE),
"col_3" = sample(1:7, size = 10, replace = TRUE),
"col_4" = sample(1:7, size = 10, replace = TRUE)
)
Теперь, когда я знаю все точки данных, я могу рассчитать общее стандартное отклонение следующим образом:
> sd(as.matrix(dummy_data))
[1] 1.727604
Но реальные данные, которые у меня есть под рукой, следующие:
> dplyr::summarise_all(dummy_data, sd)
col_1 col_2 col_3 col_4
1 1.837873 1.873796 1.37032 1.888562
Если я буду следовать обычному методу расчета среднего значения нескольких стандартных отклонений с аналогичными размерами выборки, я бы применил следующее:
sds <- dplyr::summarise_all(dummy_data, sd)
vars <- sds^2
mean_sd <- sqrt(sum(vars) / (length(vars) - 1))
> mean_sd
[1] 2.027588
что не то же самое! Сейчас попробовал без минуса:
> sqrt(sum(vars) / (length(vars)))
[1] 1.755942
что не решает проблему. Я попытался определить собственную функцию стандартного отклонения следующим образом:
own_sd <- function(x) {
sqrt(sum((x - mean(x))^2) / length(x))
}
чтобы исключить x - 1 на шаге dplyr::summarise_all(), а затем усреднить в соответствии с шагом выше:
> sqrt(sum(dplyr::summarise_all(dummy_data, own_sd)^2) / 3)
[1] 1.923538
> sqrt(sum(dplyr::summarise_all(dummy_data, own_sd)^2) / 4)
[1] 1.665833
Но все, похоже, дают другой результат, чем метод sd(as.matrix()). Что здесь происходит не так?
Спасибо за эту ссылку! Будет читать в нем и сделать работу над этим.





Вы не можете рассчитать глобальное SD, зная только групповые SD. Например:
x1 = 1:5
x2 = 11:15
x3 = 101:105
## all the SDs are equal
(sd1 = sd(x1))
#[1] 1.581139
(sd2 = sd(x2))
#[1] 1.581139
(sd3 = sd(x3))
#[1] 1.581139
## however, combining the groups in pairs give very different results
sd(c(x1, x2))
# [1] 5.477226
sd(c(x1, x3))
# [1] 52.72571
Это показывает, что даже если размеры выборки идентичны, знание стандартного отклонения двух групп не поможет вам рассчитать стандартное отклонение этих групп вместе взятых.
Согласно комментарию Мерийна ван Тилборга, если вы знаете размеры группы и среднее значение группы, расчет возможен как показано здесь.
Большое спасибо за уделенное время! Что тогда говорит вам среднее SD, рассчитанное с помощью sqrt(sum(sd^2) / (n - 1))? Для чего это используется, если не для глобального стандартного отклонения?
Я никогда не слышал об этом, мне кажется, это бесполезно. Где вы его нашли?
Может быть, было бы разумно, если бы все переменные имели одинаковое среднее значение и одинаковый размер выборки? Похоже, там какие-то большие предположения.
Ну, я думаю, что это было просто моим недостатком знаний по этому вопросу. Я думаю, что искал, используя неправильные термины, но я нашел wtd.stats методы в пакете Hmisc, вот документация. В исходном коде используется аналогичный подход, который я очень кратко изложил в своем комментарии. Я хотел использовать веса как количество наблюдений для каждого стандарта, например. std_1 из 10 наблюдений, std_2 из 20, я хотел рассчитать wtd.var(c(std_1^2, std_2^2), c(10, 20)).
Причина, по которой я выбрал этот метод, заключается в том, что я нашел нить здесь во время поиска в Google, который сказал, что вы можете суммировать отклонения. Я нашел еще пару таких страниц, но я думаю, что это просто что-то другое.
Это правда если у вас есть независимые нормальные распределения, которые вы суммируете вместе. Ваши данные ненормальны (вы используете sample, поэтому у вас есть дискретное равномерное распределение), и вы объединяете данные, а не суммируете их. Так что это очень далеко от применения в этом случае.
Также взгляните сюда, если у вас есть группа означает также: math.stackexchange.com/questions/2971315/…