首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:标记异常值中的bug(R如何识别无限小数的长度)

R:标记异常值中的bug(R如何识别无限小数的长度)
EN

Stack Overflow用户
提问于 2015-07-03 04:27:21
回答 2查看 207关注 0票数 2

我在运行流程代码时遇到了问题:

代码语言:javascript
复制
library("outliers")

#flags the outliers
grubbs.flag <- function(x) {
  outliers <- NULL
  test <- x
  grubbs.result <- grubbs.test(test)
  pv <- grubbs.result$p.value
  while(pv < 0.05) {
    outliers <- c(outliers,as.numeric(strsplit(grubbs.result$alternative," ")[[1]][3]))
    test <- x[!x %in% outliers]
    grubbs.result <- grubbs.test(test)
    pv <- grubbs.result$p.value
  }
  return(data.frame(X=x,Outlier=(x %in% outliers)))
}

# make a vector consists of infinite decimals as an example
a=c(1,5,7,9,110)
b=c(3,3,3,3,3)
x=a/b
grubbs.flag(x)

代码最初来自How to repeat the Grubbs test and flag the outliers

如果向量x由无限个小数组成,当存在孤立点时,test <- x[!x %in% outliers]中可能会出现错误。

test <- x[!x %in% outliers]中,无限小数outliers不能被识别为x的一个元素,而会下降到一个end循环中。原因可能是x中异常值的长度与outliers的长度不同。

所以我很好奇R是如何识别无限十进制向量的长度的,以及如何处理这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-03 05:35:01

有几种方法可以解决这个问题。您可以使用all.equal或仅仅测试看看数字是否几乎相同。

代码语言:javascript
复制
grubbs.flag <- function(x, tol=1e-9) {
    check <- function(a, b) any(abs(a - b) < tol)                    # check for nearly equal
    outliers <- NULL
    test <- x
    grubbs.result <- grubbs.test(test)
    pv <- grubbs.result$p.value
    while(pv < 0.05) {
        outliers <- c(outliers,as.numeric(strsplit(grubbs.result$alternative," ")[[1]][3]))
        inds <- sapply(test, check, outliers)                        # replace the %in% test
        test <- test[!inds]
        grubbs.result <- grubbs.test(test)
        pv <- grubbs.result$p.value
    }
    return(data.frame(X=x,Outlier=sapply(x, check, outliers)))       # replace %in% test
}

a=c(-1e6, 1,5,7,9,110, 1000)
b=3
c=a/b
grubbs.flag(c)

#              X Outlier
# 1 -3.333333e+05  TRUE
# 2 3.333333e-01   FALSE
# 3 1.666667e+00   FALSE
# 4 2.333333e+00   FALSE
# 5 3.000000e+00   FALSE
# 6 3.666667e+01    TRUE
# 7 3.333333e+02    TRUE
票数 1
EN

Stack Overflow用户

发布于 2015-07-06 03:10:13

最后,我使用了所有的all.equal函数来处理这个问题,它非常适合我。只是使用愚蠢的循环!╮(╯◇╰)╭

代码语言:javascript
复制
library(outliers)

# comparing the value of vectors element-wise
match_allequal=function(x,y){
  Logical_i=FALSE
  for(i in 1:length(y)){
    Logical_j=NULL
    for( j in 1:length(x)){
      Logical_j=c(Logical_j,isTRUE(all.equal(x[j],y[i])))
    }
    Logical_i=Logical_j|Logical_i
  }
  return (Logical_i)
}

#flags the outliers
grubbs.flag <- function(x) {
  outliers <- NULL
  test <- x
  grubbs.result <- grubbs.test(test)
  pv <- grubbs.result$p.value
  while(pv < 0.05) {
    outliers <- c(outliers,as.numeric(strsplit(grubbs.result$alternative," ")[[1]][3]))
    test <- x[!match_allequal(x,outliers)]
    grubbs.result <- grubbs.test(test)
    pv <- grubbs.result$p.value
  }
  return(data.frame(X=x,Outlier=match_allequal(x,outliers)))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31198471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档