从数据集 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 循环更快的方法(我的数据集有 1200 万行以上,我必须通过这个过程 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
table 很大,可能 需要很长时间。在这种情况下,预分配整个矩阵会更快。然后你可以简单地删除最后的 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), ]
我为我的数据集创建了一个线性模型,其中包含约 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 循环更快的方法(我的数据集有 1200 万行以上,我必须通过这个过程 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
table 很大,可能 需要很长时间。在这种情况下,预分配整个矩阵会更快。然后你可以简单地删除最后的 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), ]