Выполните тест стандартности Шапиро-Вилка

Я хочу выполнить тест на нормальность Шапиро-Уилка. Мои данные в формате csv. Это выглядит так:

 heisenberg
    HWWIchg
1    -15.60
2    -21.60
3    -19.50
4    -19.10
5    -20.90
6    -20.70
7    -19.30
8    -18.30
9    -15.10

Однако, когда я выполняю тест, я получаю:

 shapiro.test(heisenberg)

Ошибка в [.data.frame (x, complete.cases(x)): выбраны неопределенные столбцы

Почему R не выбирает правильный столбец и как мне это сделать?

Ответ 1

Что делает shapiro.test?

shapiro.test проверяет гипотезу Null о том, что "образцы получены из нормального распределения" против альтернативной гипотезы "образцы не поступают из нормального распределения".

Как выполнить shapiro.test в R?

Страница справки R для ?shapiro.test дает,

x - a numeric vector of data values. Missing values are allowed, 
    but the number of non-missing values must be between 3 and 5000.

То есть, shapiro.test ожидает ввод числового вектора, который соответствует образцу, который вы хотите протестировать, и это единственный требуемый вход. Поскольку у вас есть data.frame, вам нужно передать желаемый столбец в качестве входного сигнала функции следующим образом:

> shapiro.test(heisenberg$HWWIchg)
#   Shapiro-Wilk normality test

# data:  heisenberg$HWWIchg 
# W = 0.9001, p-value = 0.2528

Интерпретация результатов от shapiro.test:

Во-первых, я сильно предлагаю вам прочитать этот отличный ответ от Ian Fellows по testing for normality.

Как показано выше, shapiro.test проверяет гипотезу NULL, что образцы пришли из нормального распределения. Это означает, что если ваше значение p <= 0,05, то вы отклоните гипотезу NULL, что образцы были получены из нормального распределения. Как хорошо говорит Ян Феллоуз, вы тестируете против предположение о нормальности ". Другими словами (исправьте меня, если я ошибаюсь), было бы намного лучше, если бы проверили гипотезу NULL, что образцы не из нормального распределения Почему? Потому что отклонение гипотезы NULL - это не то же самое, что принять альтернативную гипотезу.

В случае нулевой гипотезы shapiro.test, p-значение <= 0,05 отклонило бы нулевую гипотезу о том, что образцы получены из нормального распределения. Говоря свободно, есть редкий шанс, что образцы пришли из нормального распределения. Побочным эффектом этого тестирования гипотез является то, что этот редкий случай случается очень редко. Чтобы проиллюстрировать это, возьмите, например:

set.seed(450)
x <- runif(50, min=2, max=4)
shapiro.test(x)
#   Shapiro-Wilk normality test
# data:  runif(50, min = 2, max = 4) 
# W = 0.9601, p-value = 0.08995

Итак, этот (конкретный) образец runif(50, min=2, max=4) происходит из нормального распределения в соответствии с этим тестом. То, что я пытаюсь сказать, заключается в том, что существует множество случаев, когда "экстремальные" требования (p < 0,05) не выполняются, что приводит к принятию гипотезы "NULL" в большинстве случаев, что может вводить в заблуждение.

Еще одна проблема, которую я хотел бы привести здесь из @PaulHiemstra из комментариев о влиянии на большой размер выборки:

Дополнительная проблема с тестом Шапиро-Вилка заключается в том, что когда вы подаете больше данных, вероятность отклонения нулевой гипотезы становится больше. Итак, что происходит, так это то, что для больших объемов данных могут быть обнаружены даже очень малые отклонения от нормальности, что приводит к отказу от события нулевой гипотезы, хотя для практических целей данные более чем достаточно нормальны.

Хотя он также указывает, что ограничение размера данных R немного защищает это:

К счастью, shapiro.test защищает пользователя от описанного выше эффекта, ограничивая размер данных до 5000.

Если гипотеза NULL была противоположной, то есть, выборки не происходят из нормального распределения, и вы получаете значение p < 0,05, то вы заключаете, что очень редко эти образцы не происходят из нормального распределения (отклоните гипотезу NULL). Это легко переводит: Очень вероятно, что образцы обычно распределяются (хотя некоторым статистикам может не нравиться этот способ интерпретации). Я считаю, что это то, что Ян Феллоуз попытался объяснить в своем посте. Пожалуйста, поправьте меня, если я ошибаюсь!

@PaulHiemstra также комментирует практические ситуации (пример регрессии), когда вы сталкиваетесь с этой проблемой тестирования на нормальность:

На практике, если анализ предполагает нормальность, например, lm, я бы не сделал этого теста Шапиро-Вилка, но сделайте анализ и посмотрите на диагностические графики результатов анализа, чтобы судить о том, были ли какие-либо предположения анализа слишком нарушенными. Для линейной регрессии с использованием lm это делается путем просмотра некоторых диагностических графиков, которые вы используете с использованием графика (lm()). Статистика - это не серия шагов, которые качают несколько чисел (эй p < 0,05!), Но требует большого опыта и навыков в оценке правильности анализа ваших данных.

Здесь я нахожу ответ от Яна Феллоуза на комментарий Бена Болкера по тому же вопросу, который уже связан выше (если не больше) информативным:

Для линейной регрессии

  • Не беспокойтесь о нормальности. CLT берет на себя быстро, и если у вас есть все, кроме наименьших размеров выборки и даже удаленной разумно выглядящей гистограммы, вы в порядке.

  • Беспокойство о неравных отклонениях (гетероскедастичность). Я беспокоюсь об этом до уровня (почти), используя тесты HCCM по умолчанию. График местоположения масштаба даст некоторое представление о том, нарушено ли это, но не всегда. Кроме того, нет априорной причины предполагать равные отклонения в большинстве случаев.

  • Выпадающие. Расстояние поварa > 1 является разумной причиной для беспокойства.

Это мои мысли (FWIW).

Надеюсь, что это немного облегчит.

Ответ 2

Вы применяете shapiro.test() к data.frame вместо столбца. Попробуйте следующее:

shapiro.test(heisenberg$HWWIchg)

Ответ 3

Не удалось указать точные столбцы (данные) для проверки на нормальность. Используйте это вместо

shapiro.test(heisenberg$HWWIchg)

Ответ 4

Установите данные как вектор и затем поместите в функцию.