Преобразование данных с повторяющимися значениями
У меня много фреймов данных, похожих на
times = c("2015-12-30 20:00:00", "2016-01-06 20:00:00",
"2016-01-08 20:00:00", "2016-01-11 20:00:00",
"2016-01-13 20:00:00", "2016-01-14 20:00:00",
"2016-01-15 20:00:00", "2016-01-18 20:00:00",
"2016-01-20 20:00:00", "2016-01-21 20:00:00",
"2016-01-25 20:00:00")
counts = c(7, 14, 61, 1, 2, 66, 10, 35, 1, 304, 2)
df <- data.frame(timestamp = as.POSIXct(times, format="%Y-%m-%d %H:%M:%S",
tz="Pacific/Auckland"),
count = counts)
Я пытаюсь определить выбросы в наборах данных, аналогичных приведенному выше. Глядя на нормальный график QQ и гистограмму, очевидно, что эта выборка не из нормального распределения.
hist(df$count)
qqnorm(df$count)
qqline(df$count)
Затем я использую преобразование мощности Бокса-Кокса и пытаюсь приблизить данные к нормально распределенным данным.
lambda <- geoR::boxcoxfit(df$count)$lambda
df$transformed <- car::bcPower(df$count, lambda=lambda)
Примечание. Мне известны другие способы поиска параметра преобразования Бокса-Кокса, например использование forecast
, или же car
пакеты. Существуют также методы, использующие расширенное семейство функций преобразования Бокса-Кокса и оптимизирующие переменные, как в /questions/18238329/kak-prochitat-znachenie-iz-reestra-windows/18238335#18238335. Одна из причин, по которой я не пользуюсь forecast
является то, что в большинстве случаев мои данные не равноудалены и не несут типичные свойства временных рядов. Другое дело, что мне нужно автоматизировать процесс. Любой метод, который подходит для GLM или LM вслепую, просто не возвращает ничего полезного.
После преобразования данных и вычисления z-показателей по преобразованным данным мы получаем
timestamp count transformed zscore
1 2015-12-30 20:00:00 7 1.7922836 -0.14446864
2 2016-01-06 20:00:00 14 2.3618561 0.22598616
3 2016-01-08 20:00:00 61 3.4646761 0.94326978
4 2016-01-11 20:00:00 1 0.0000000 -1.31018523
5 2016-01-13 20:00:00 2 0.6729577 -0.87248782
6 2016-01-14 20:00:00 66 3.5198741 0.97917102
7 2016-01-15 20:00:00 10 2.0895953 0.04890541
8 2016-01-18 20:00:00 35 3.0646823 0.68311037
9 2016-01-20 20:00:00 1 0.0000000 -1.31018523
10 2016-01-21 20:00:00 304 4.5195550 1.62937200
11 2016-01-25 20:00:00 2 0.6729577 -0.87248782
Хотя после преобразования данные становятся ближе к нормально распределенным данным, наличие точек данных, равных 1 с, искажает процесс стандартизации. Итак, явного выброса вообще не обнаружено. Большинство статей, постов в блогах или аналогичных СМИ по стандартизации данных никогда не говорят об этих крайних случаях.
Когда я начал набирать этот вопрос, я собирался спросить, есть ли другие методы преобразования, которые могут обрабатывать 1, но я понял, что это не имеет значения.
Как бы вы справились с наличием множества одинаковых значений в наборе данных? Особенно, если они находятся на двух крайностях, как минимум или максимум набора данных.