#r #regression #robust
#r #регрессия #надежная
Вопрос:
Я использую lmrob
функцию в R, используя robustbase
библиотеку для надежной регрессии. Я бы использовал это как, rob_reg<-lmrob(y~0 .,dat,method="MM",control=a1)
. Когда я хочу вернуть сводку, которую я использую summary(rob_reg)
, и одна вещь, которую делает надежная регрессия, — это выявление выбросов в данных. Определенная часть сводного вывода дает мне следующее,
6508 observations c(49,55,58,77,104,105,106,107,128,134,147,153,...)
are outliers with |weight| <= 1.4e-06 ( < 1.6e-06);
в котором перечислены все выбросы, в данном случае 6508 (я удалил большинство и заменил его на …). Мне нужно как-то получить эти выбросы и удалить их из моих данных. То, что я делал раньше, заключалось в том, чтобы использовать summary(rob_reg)$rweights
для получения всех весов для наблюдений и удаления этих наблюдений с весом меньше, чем, скажем, определенное значение в приведенном выше примере, значение будет 1.6e-06
. Я хотел бы знать, есть ли способ получить список только выбросов без предварительного получения весов всех наблюдений?
Комментарии:
1. Код, который печатает выбросы для
summary()
, фактическиsummarizeRobWeights()
включен, и он делает то же самое, что и вы. Он извлекает значения rweights и возвращает те, гдеabs(weight) < eps
. кажется, что он возвращает только сводную таблицу, а не сами значения.2. Надежная регрессия на самом деле не предназначена для проверки выбросов. Это в первую очередь (рекомендуемый) способ справиться с наличием выбросов. Удаление 6508 значений как выбросов из набора данных кажется действительно плохой идеей.
3. Мне нужно удалить выбросы и снова запустить обычную регрессию
lm
. С выбросами условия ошибки обычно не распределяются, и мне нужно показать, что без выбросов условия ошибки распределяются нормально. 6508 — это лишь небольшое количество моих наблюдений, так как всего у меня около 350 00 наблюдений.4. Я не согласен с Roland. Надежная регрессия предназначена для более точной идентификации выбросов как OLS. В OLS некоторые выбросы могут быть замаскированы из-за их влияния на коэффициенты регрессии (они наклоняют линию тренда регрессии в их направлении. Итак, выбросы уже несколько изменены). Надежная регрессия из-за недооценки выбросов приводит к тому, что они оказывают меньшее влияние на линию тренда регрессии. И, таким образом, быть дальше от него. Таким образом, они проявляются более отчетливо, чем в OLS.
Ответ №1:
Это старый пост, но недавно у меня возникла необходимость в этом, поэтому я решил поделиться своим решением.
#fit the model
fit = lmrob(y ~ x, data)
#create a model summary
fit.summary = summary(fit)
#extract the outlier threshold weight from the summary
out.thresh = fit.summary$control$eps.outlier
#returns the weights corresponding to the outliers
#names(out.liers) corresponds to the index of the observation
out.liers = fit.summary$rweights[which(fit.summary$rweights <= out.thresh)]
#add a True/False variable for outlier to the original data by matching row.names of the original data to names of the list of outliers
data$outlier = rep(NA, nrow(data))
for(i in 1:nrow(data)){
data$outlier[i] = ifelse(row.names(data[i] %in% names(out.liers), "True", "False")
}