Выбросы с надежной регрессией в R

#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")
    }