相同矩阵的log和sqrt的相关性

时间:2018-02-19 12:02:13

标签: r correlation r-corrplot

我有一个包含9个变量的数据框subs 我想得到日志和变量的平方根之间的相关性。

所以我首先计算2个矩阵:

library(corrplot)

logs = log(subs)
sqroots = sqrt(subs)

然后我替换无限值,如果有的话:

logs = do.call(data.frame,lapply(logs, function(x) replace(x, 
is.infinite(x),NA)))

sqroots = do.call(data.frame,lapply(sqroots, function(x) replace(x, 
is.infinite(x),NA)))

然后我使用corrplot绘制相关矩阵:

corrplot(cor(logs,sqroots, use = "complete.obs"), order = "AOE")

但它给出了错误:

Error in e1 > 0 : invalid comparison with complex values

我在这里做错了什么?在此先感谢您的帮助!

subshttps://pastebin.com/raw/y35FG2ZV

2 个答案:

答案 0 :(得分:2)

我认为问题在于你是如何试图摆脱无限的价值观。 以下应该解决您的问题:

library(corrplot)

### Defining subs & onlyNum for the code to be reproducible###
subs <- matrix(nrow = 5, ncol = 5)
for(k in 1:5){subs[,k] <- sample(1:100, 5);rm(k)}
onlyNum <- 1:5

### To the answer ###
logs = log(subs[,onlyNum])
sqroots = sqrt(subs[,onlyNum])

### The 2 lines below should solve your issue ###
logs[which(is.infinite(logs), arr.ind = TRUE)] <- NA
sqroots[which(is.infinite(sqroots), arr.ind = TRUE)] <- NA

corrplot(cor(logs,sqroots, use = "complete.obs"), order = "AOE")

以下是输出结果:

<强>更新

现在已经提供了该数据,编辑顺序正常。

(1)由于subs是一个数据框,is.infinite没有实现数据框架的方法,因此必须分别使用sapply(logs, is.infinite)代替is.infinite(logs) sqroots

(2)然而,正如所指出的,问题在于order = "AOE":&#34; AOE&#34; (特征向量的角度顺序)仅针对实值特征值定义,因为它需要检查正性(c.f。?corrMatOrder)。计算相关矩阵的特征值得出:

> eigen(cor(logs,sqroots, use = "complete.obs"))$values
[1] 2.35892882+0.0000000i 1.69884142+0.0000000i 1.16180544+0.0000000i
[4] 0.99435961+0.0176823i 0.99435961-0.0176823i 0.89281529+0.0000000i
[7] 0.32520739+0.0000000i 0.29605683+0.0000000i 0.05592473+0.0000000i

因此必须选择order的另一个参数,例如order = "FPC"(第一主成分)。

答案 1 :(得分:0)

好的,我解决了我的问题。 我需要删除参数order = "AOE" 原因可能是因为log和sqrt之间的相关性不是对称的,因此它无法命令它们找到模式。

感谢大家!