2

我正在尝试找到一种好方法来测试两个向量之间的相关性是否完美(或不适用)。我尝试了很多不同的方法,但我对所有这些方法都遇到了类似的问题,即相关性的结果并没有按照我期望的方式进行评估。

这是我的最新示例:

foo1 <- c(4, NA, 6, NA)   
foo2 <- c(1, 2, 3, 4)
set  <- c(-1, 1, NA)
correlation <- cor(foo1, foo2, use = "na.or.complete")  # Result: 1
correlation %in% set  # Should be TRUE, is FALSE
correlation == 1      # Should also be TRUE, but is FALSE

is.numeric(correlation) 为真。我能在其中或周围看到的唯一值是 1。那么为什么这在世界上不起作用?

set  <- c('-1', '1', NA)

这可行,但我不确定为什么,而且我担心它可能会失败,因为我显然不明白返回值发生了什么。

任何见解都会有所帮助!

4

3 回答 3

2

相反,您可以确保它们与您的集合足够接近:

mytol <- 1e-10
set <- set[1:2]
any(abs(correlation - set) <= mytol)|is.na(correlation) # TRUE

我猜这与浮动和公差有关。我不确定标准参考是什么,但这是其中之一:R中的数字比较困难

1 不是真正的 1;如果你想要一个整数(我想你不应该),你可以使用1L. 1:3像和一样创建的向量seq(1,3)也是整数。查看?integer?numeric了解更多信息。奇怪的是,我找不到涵盖类之间差异的文档页面。

编辑:我拆分了 NA 的检查,因为正如 OP 指出的那样,它没有用。

于 2013-05-20T16:58:02.833 回答
2

我认为这基本上是FAQ 7.31,但是“我如何查看一个值是否在一个集合内(在容差范围内)”需要稍微扩展标准“仅使用all.equal()”答案......

test <- function(x) {
          isTRUE(all.equal(x,-1)) || 
            isTRUE(all.equal(x,1)) || is.na(x)
}
test(1-1e-14)  ## TRUE
test(NA)       ## TRUE
test(0.88)      ## FALSE

是您问题的最精确解决方案,尽管我可以看到如果您有更长的候选人名单会变得很困难......因为isTRUE(all.equal(1,NA))FALSE因为方便)也许

test <- function(x,candidates=c(-1,1,NA), ...) {
    any(sapply(lapply(candidates,all.equal,target=x,...),
               isTRUE))
}
test(1-1e-6)    ## FALSE
test(1-1e-6,tolerance=1e-4)  ## TRUE

这里的一个问题isTRUE(all.equal(NA,NaN))不是 TRUE,所以人们可能想在这里某个地方构建is.na()(测试NANaN),或者包括NaN在候选人列表中。

于 2013-05-20T17:34:24.040 回答
1

你们非常乐于助人。对于感兴趣的人,这就是最终结果,尽管我显然必须更多地调整我的公差。

corrIsOkay <- function(x, y){
  correlation  <- cor(x, y, use = "na.or.complete")
  if ((1 - abs(correlation)) <= .01 | is.na(correlation)){
    print(correlation)
    return(FALSE)
  }
  return(TRUE) 
}

它比我想要的要冗长得多,因为我原来的“解决方案”本身就适合 if 语句,但现在我只是在 if 语句中调用这个函数。

makeMvMissing <- function(data) {
  repeat {
      x <- makeMissing(data)[, 1]
      y <- makeMissing(data, variable.missing = "y")[, 2]
      if (corrIsOkay(x, y)){
        break
      }
    }
  return(data.frame(x, y))
}
于 2013-05-21T07:30:33.450 回答