簡體   English   中英

從數據集R中分離出外圍殘差

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM