#r #dataframe #normal-distribution
Вопрос:
Я пытаюсь выполнить тест шапиро.для моих данных в фрейме данных. У меня есть следующий фрейм данных, называемый data1
:
columnA columnB columnC 0.333 0.231 -0.123 0.235 -0.114 -0.034 -0.111 -0.234 0.442
Как вы видите, у меня три колонки. Я хотел бы протестировать все данные в одном тесте, поэтому все данные в одном образце. Я знаю, как проверить одну колонку. Но есть ли возможность проверить рамку отверстия как один образец?
Приведенные здесь данные являются лишь примером. У меня больше столбцов и намного больше строк в реальных данных.
Спасибо.
Комментарии:
1.
unlist(data1)
вернет все данные в виде одного вектора; убедитесь, что у вас там нет нечисловых данных, иначе классы будут принудительно удалены и потеряны.
Ответ №1:
Визуальный контроль распределения значений в наборе данных является самым быстрым способом определения того, нормально ли распределены данные:
df lt;- data.frame(columnA = c(0.333, 0.235, -0.111), columnB = c(0.231, -0.114, -0.234), columnC = c(-0.123, -0.034, 0.442)) # Convert dataframe to vector (with loss of data structure information) vec lt;- as.vector(t(df)) vec # [1] 0.333 0.231 -0.123 0.235 -0.114 -0.034 -0.111 -0.234 0.442 hist(vec)
Альтернативой вышесказанному является использование data.table для преобразования данных перед построением графика, чтобы сохранить информацию о структуре данных:
library(data.table) df lt;- data.frame(columnA = c(0.333, 0.235, -0.111), columnB = c(0.231, -0.114, -0.234), columnC = c(-0.123, -0.034, 0.442)) # Convert to data.table dt lt;- as.data.table(df) # Pivot long (columns to rows) dt lt;- melt(dt) # variable value # 1: columnA 0.333 # 2: columnA 0.235 # 3: columnA -0.111 # 4: columnB 0.231 # 5: columnB -0.114 # 6: columnB -0.234 # 7: columnC -0.123 # 8: columnC -0.034 # 9: columnC 0.442 hist(dt$value)
В качестве альтернативы вы можете использовать статистическое описание, чтобы внести свой вклад в интерпретацию того, нормально ли распределены данные или нет, например, когда данные распределены нормально, мы ожидаем, что среднее, медиана и режим будут примерно одинаковыми:
# Values are continuous so it is necessary to bin the data to calculate the mode # The hist function does this for us plt lt;- hist(dt$value) # The mode is a bin range mode lt;- paste0("(", plt$breaks[which(plt$counts==max(plt$counts), arr.ind=T)], ", ", plt$breaks[(which(plt$counts==max(plt$counts), arr.ind=T) 1)], "]") # Summarise mean and median and add mode to data displayed dt[, .(mean=mean(value), median=median(value)) ][, lapply(.SD, round, 3) ][, .(mean, median, mode)] # mean median mode # 1: 0.069 -0.034 (-0.2, -0.1]
Вам необходимо интерпретировать числа (и их приблизительную разницу или ее отсутствие), чтобы определить, нормально ли распределены данные.
Теоретически вы могли бы попробовать использовать тест на соответствие хи-квадрат для сравнения ваших эмпирических данных с имитацией данных, полученных случайным образом из случайного распределения с использованием параметров вашей выборки, но вам нужно будет продумать несколько вопросов (например, сколько разрывов мне нужно для размещения моих данных, сколько записей-достаточное количество записей, чтобы убедиться, что ячейки не пусты из-за малого размера выборки, но не настолько велики, чтобы сделать хи-квадрат более чувствительным и т. Д.).
Существуют и другие меры (например, перекос, эксцесс, передозировка), которые вы также могли бы рассмотреть.
Комментарии:
1. Что касается визуальных проверок, стоит добавить, что оператору следует рассмотреть график Q-Q своих данных, чтобы проверить их на нормальность.