Выбросы с устойчивой регрессией в 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. Я хотел бы знать, есть ли способ получить список только выбросов без предварительного получения весов всех наблюдений?


person Jason Samuels    schedule 27.06.2014    source источник
comment
Код, который выводит выбросы для summary(), на самом деле находится в summarizeRobWeights() и делает то же самое, что и вы. Он извлекает весовые коэффициенты и возвращает те, где abs(weight) < eps. он только кажется возвращает сводную таблицу, а не сами значения.   -  person MrFlick    schedule 28.06.2014
comment
Надежная регрессия на самом деле не предназначена для проверки на выбросы. Это в первую очередь (рекомендуемый) способ иметь дело с наличием выбросов. Удаление значений 6508 как выбросов из набора данных кажется действительно плохой идеей.   -  person Roland    schedule 28.06.2014
comment
Мне нужно удалить выбросы и снова запустить нормальную регрессию с lm. С выбросами термины ошибки обычно не распределяются, и мне нужно показать без выбросов, что термины ошибки обычно распределяются. 6508 - это лишь небольшая часть моих наблюдений, так как всего у меня около 350 00 наблюдений.   -  person Jason Samuels    schedule 28.06.2014
comment
Я не согласен с Роландом. Робастная регрессия предназначена для более точного определения выбросов с помощью метода OLS. В рамках OLS некоторые выбросы могут быть замаскированы из-за их влияния на коэффициенты регрессии (они наклоняют линию тренда регрессии в своем направлении. Таким образом, выбросы уже несколько приглушены). Устойчивая регрессия путем недооценки выбросов заставляет их оказывать меньшее влияние на линию тренда регрессии. И таким образом быть подальше от него. Таким образом, они проявляются более отчетливо, чем в OLS.   -  person Sympa    schedule 30.12.2015


Ответы (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")
    }
person Melissa Anthony    schedule 17.08.2016