[英]Separate outlying residuals from dataset R
我為數據集創建了一個線性模型,該模型包含約1200萬行。 使用殘差,我為離群值確定了邊界。 下圍欄和上圍欄。
現在,我要提取離群值並將其對應的數據放入向量中或將其寫入文件中。
這是我原始數據集中的兩行:
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循環更快的方法(我的數據集是12M +行,我必須經過14次此過程)。
您可以嘗試循環。
OutlierUpperBoundary <- data.frame(matrix(ncol = ncol(res)))
out_index <- 1
for(row in 1:length(resid(lmfit))){
if(resid(lmfit)[row]>upp_fence){
OutlierUpperBoundary[out_index, ] <- res[row, ]
out_index <- out_index + 1
}
}
如果您的res
表很大,那可能會花費很長時間。 在這種情況下,預分配完整矩陣將更快。 然后,您可以簡單地刪除末尾的NA行。
OutlierUpperBoundary <- data.frame(matrix(ncol = ncol(res), nrow = nrow(res)))
out_index <- 1
for(row in 1:length(resid(lmfit))){
if(resid(lmfit)[row]>upp_fence){
OutlierUpperBoundary[out_index, ] <- res[row, ]
out_index <- out_index + 1
}
}
OutlierUpperBoundary <- OutlierUpperBoundary[complete.cases(OutlierUpperBoundary), ]
在執行賦值操作時,可以通過將殘值與原始行結合使用cbind()
將殘值添加到輸出中。
OutlierUpperBoundary <- data.frame(matrix(ncol = ncol(res) + 1, nrow = nrow(res)))
out_index <- 1
for(row in 1:length(resid(lmfit))){
if(resid(lmfit)[row]>upp_fence){
OutliersUpperBoundary[out_index,] <- cbind(res[row,], resid(lmfit)[row])
out_index <- out_index + 1
}
}
OutlierUpperBoundary <- OutlierUpperBoundary[complete.cases(OutlierUpperBoundary), ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.