nel*_*ell 1 loops r missing-data correlation
我想要一个只有相关系数大于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)
}
Run Code Online (Sandbox Code Playgroud)
这很好用.不幸的是,我的数据集包含缺失值.
mts.data[1:3, 4] <- NA
mts.data[9:10, 5] <- NA
Run Code Online (Sandbox Code Playgroud)
当我运行我的功能时,我收到了一个错误.
critcor(mts.data)
# Error in if (abs(cor(x[, i], x[, j])) > 0.2) { :
# missing value where TRUE/FALSE needed
Run Code Online (Sandbox Code Playgroud)
我现在正在浏览互联网几个小时,我完全不知道如何解决这个问题.如果由于缺少值而无法进行相关,我希望我的函数只打印0.
您可以像这样大大简化代码:
cm = cor(mts.data, use = "p")
cm[abs(cm) <= 0.2] = 0
Run Code Online (Sandbox Code Playgroud)
这使:
> 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
Run Code Online (Sandbox Code Playgroud)
该片段use = "p"是"成对完整观察"的缩写,即NA必要时将省略s.有关更多选项和详细信息,请参阅?cor.
您收到的错误是您有一个值NA.然后,比较NA > 0.2将是NA并且if不接受NA作为其输入,因此错误.