【问题标题】:Separate outlying residuals from dataset R从数据集 R 中分离异常残差
【发布时间】:2015-09-23 14:57:37
【问题描述】:

我为我的数据集创建了一个线性模型,该模型由大约 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 次。)

【问题讨论】:

    标签: r outliers


    【解决方案1】:

    你可以试试循环。

    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), ]
    

    【讨论】:

    • 这实际上复制了整个矩阵,并且只将值放在离群行中。其余的标记为 。我会用更多信息编辑我原来的问题:)
    • 糟糕!这可以通过单独增加输出索引来解决。已编辑。
    • 谢谢,这似乎可以解决问题!附带说明:我将您帖子中的 = 符号编辑为
    • 另外,知道一点R,我认为一定有比使用for循环更快的方法(我的数据集是12M+行,我必须经历这个过程14次。)跨度>
    • 你是对的,可能有更好的方法。我添加了一个在更大数据集上会更快的解决方案。希望这对现在有所帮助。
    猜你喜欢
    • 2017-03-11
    • 2021-07-26
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 2012-09-27
    • 2013-03-10
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多