Как рассчитать среднее значение нескольких стандартных отклонений в R?

Я пытаюсь понять, как рассчитать стандартное отклонение набора данных, когда у меня есть пара стандартных отклонений. Давайте просто посмотрим на этот 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()). Что здесь происходит не так?

Также взгляните сюда, если у вас есть группа означает также: math.stackexchange.com/questions/2971315/…

Merijn van Tilborg 11.05.2022 16:49

Спасибо за эту ссылку! Будет читать в нем и сделать работу над этим.

GroenteLepel 12.05.2022 09:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете рассчитать глобальное 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))? Для чего это используется, если не для глобального стандартного отклонения?

GroenteLepel 12.05.2022 09:11

Я никогда не слышал об этом, мне кажется, это бесполезно. Где вы его нашли?

Gregor Thomas 12.05.2022 14:51

Может быть, было бы разумно, если бы все переменные имели одинаковое среднее значение и одинаковый размер выборки? Похоже, там какие-то большие предположения.

Gregor Thomas 12.05.2022 14:52

Ну, я думаю, что это было просто моим недостатком знаний по этому вопросу. Я думаю, что искал, используя неправильные термины, но я нашел wtd.stats методы в пакете Hmisc, вот документация. В исходном коде используется аналогичный подход, который я очень кратко изложил в своем комментарии. Я хотел использовать веса как количество наблюдений для каждого стандарта, например. std_1 из 10 наблюдений, std_2 из 20, я хотел рассчитать wtd.var(c(std_1^2, std_2^2), c(10, 20)).

GroenteLepel 13.05.2022 10:00

Причина, по которой я выбрал этот метод, заключается в том, что я нашел нить здесь во время поиска в Google, который сказал, что вы можете суммировать отклонения. Я нашел еще пару таких страниц, но я думаю, что это просто что-то другое.

GroenteLepel 13.05.2022 10:01

Это правда если у вас есть независимые нормальные распределения, которые вы суммируете вместе. Ваши данные ненормальны (вы используете sample, поэтому у вас есть дискретное равномерное распределение), и вы объединяете данные, а не суммируете их. Так что это очень далеко от применения в этом случае.

Gregor Thomas 13.05.2022 18:48

Другие вопросы по теме