缺少值的cor()

缺少值的cor(),r,loops,correlation,missing-data,R,Loops,Correlation,Missing Data,我想要一个只有相关系数大于0.2的矩阵。我提出了以下解决方案 mts.data <- ts(data.frame(a=arima.sim(model=list(1,0,0), n=10), b=arima.sim(model=list(1,0,1), n=10), c=arima.sim(model=list(1,0,0), n=10), d=arima.sim(model=list(1,0,2), n=10), e=arima.sim(model=

我想要一个只有相关系数大于0.2的矩阵。我提出了以下解决方案

mts.data <- ts(data.frame(a=arima.sim(model=list(1,0,0), n=10), 
      b=arima.sim(model=list(1,0,1), n=10), c=arima.sim(model=list(1,0,0), 
      n=10), d=arima.sim(model=list(1,0,2), n=10),
      e=arima.sim(model=list(2,0,1), n=10)), start=c(2007,1), frequency=12)

critcor <- function(x) {
  crit.mat <- matrix(0, nrow=ncol(x), ncol=ncol(x))
  for(j in 1:ncol(x)) {
    for(i in 1:ncol(x)) {
      if(abs(cor(x[,i], x[,j])) > 0.2) {
        crit.mat[i,j] <- cor(x[,i], x[,j])
      }
    }
  }
  return(crit.mat)
}

我现在在网上浏览了好几个小时,我完全不知道该如何解决这个问题。如果由于缺少值而无法进行关联,我希望我的函数只打印一个0。

您可以像这样大大简化代码:

cm = cor(mts.data, use = "p")
cm[abs(cm) <= 0.2] = 0
代码段use=p是成对完整观察的缩写,即必要时将省略NAs。有关更多选项和详细信息,请参见?cor


您收到的错误是当您的值为NA时。然后,比较NA>0.2也将是NA,如果不接受NA作为其输入,则会出现错误

您可以这样大大简化代码:

cm = cor(mts.data, use = "p")
cm[abs(cm) <= 0.2] = 0
代码段use=p是成对完整观察的缩写,即必要时将省略NAs。有关更多选项和详细信息,请参见?cor


您收到的错误是当您的值为NA时。然后,比较NA>0.2也将是NA,如果不接受NA作为其输入,则会出现错误

请参阅cor函数的参数用法。您应该使用complete.obs或pairwise.complete.obs,可能是后者。的确。。正如@mts通过下面的p所做的那样@nelakell:这将帮助您养成阅读R帮助页面的习惯,在这种情况下?cor。它会直接告诉您,缺失的值可以得到很好的处理。谢谢@MartinMächler。这是个好建议。我是如此热衷于解决函数的问题,以至于我一开始就没有想到这一点。您应该使用complete.obs或pairwise.complete.obs,可能是后者。的确。。正如@mts通过下面的p所做的那样@nelakell:这将帮助您养成阅读R帮助页面的习惯,在这种情况下?cor。它会直接告诉您,缺失的值可以得到很好的处理。谢谢@MartinMächler。这是个好建议。我是如此热衷于解决函数的问题,以至于我一开始没有想到这一点。
cm = cor(mts.data, use = "p")
cm[abs(cm) <= 0.2] = 0
> cm
           a          b          c          d          e
a  1.0000000  0.0000000 -0.4667718 -0.5241904 -0.6864418
b  0.0000000  1.0000000  0.0000000 -0.3270387  0.0000000
c -0.4667718  0.0000000  1.0000000  0.4708803  0.5222566
d -0.5241904 -0.3270387  0.4708803  1.0000000  0.0000000
e -0.6864418  0.0000000  0.5222566  0.0000000  1.0000000