Как я могу проверить полные данные в фрейме данных на нормальное распределение?

#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 своих данных, чтобы проверить их на нормальность.