Я создал линейную модель для своего набора данных, который состоит примерно из 12 миллионов строк. Используя остатки, я установил границы выбросов. Нижний забор и верхний забор.
Теперь я хочу извлечь выбросы и поместить соответствующие данные в вектор или записать их в файл.
Вот две строки из моего исходного набора данных:
print(res[1:2,])
PIG_ID trial res$bla gain LINE CODE comp BIRTH_WEIGHT_SCALED farm_trend birth_weight_scaled
123456 XXX 0012345ABCDFF 1000 CCDDC Z <NA> 955.2 -9 -9
135411 XXX 11122233ASDDD 889 TTDDT Z <NA> 0.0 -9 -9
resid(lmfit) выводит кучу значений:
700 750 2132 3394 4123 4213 4583 4842 5288 8287 12331 12427 13726
Вот код, который вычисляет модель и выбросы:
lmfit = lm(res$gain ~ res$trial + res$bla * res$LINE* res$CODE + res$birth_weight_scaled )
kwant <- quantile(resid(lmfit), probs= c(0.25, 0.75))
Q1 <- kwant[1]
Q3 <- kwant[2]
sigma <- IQR(resid(lmfit))
upp_multi <- 3.5 ##Amount of times sigma for outlier calculation
low_multi <- 1.5 ##Amount of times sigma for outlier calculation
upp_fence <- Q3+(upp_multi * sigma)
low_fence <- Q1-(low_multi * sigma)
print(paste("Upper fence: ", upp_fence, " \t Lower Fence: ", low_fence ,"\n"))
Я безуспешно гуглил и пробовал фрагменты кода.
Псевдокод будет следующим:
if(resid(lmfit)>upp_fence){add res[row] to vector OutlierUpperBoundary }
if(resid(lmfit)<low_fence){add res[row] to vector OutlierLowerBoundary }
Есть ли способ отделить выпадающие остатки со строками из моего исходного набора данных («Res») и поместить их в матрицу?
Ожидаемый результат будет матрицей, содержащей строки с выбросами:
PIG_ID trial res$bla gain LINE CODE comp BIRTH_WEIGHT_SCALED farm_trend birth_weight_scaled
135411 XXX 11122233ASDDD 889 TTDDT Z <NA> 0.0 -9 -9
Изменить
Использование следующего цикла for копирует весь размер исходной матрицы, но просто добавляет значения к внешним строкам:
OutliersUpperBoundary <- data.frame(matrix(ncol = ncol(res)))
for (row in 1:length(resid(lmfit))){
if(resid(lmfit)[row]>upp_fence){
OutliersUpperBoundary[row,] <- res[row,]
}
}
Результат:
694 NA <NA> <NA> NA <NA> <NA> <NA> NA NA NA
695 NA <NA> <NA> NA <NA> <NA> <NA> NA NA NA
696 112341234 XXX 11213421LAAAAA 915 TTTTT B <NA> 175.2 -9 -9
697 NA <NA> <NA> NA <NA> <NA> <NA> NA NA NA
698 NA <NA> <NA> NA <NA> <NA> <NA> NA NA NA
Каким образом я должен изменить цикл for, чтобы получать только строки со значениями? (Я думаю, что rbind может работать здесь)
Кроме того, зная немного R, я думаю, что должен быть более быстрый способ, чем использование цикла for (мой набор данных составляет более 12 миллионов строк, и мне нужно пройти этот процесс 14 раз).