在给定具有多列的数据框的情况下,如何在R中以优雅的方式生成秩相关矩阵?我找不到内置函数,所以我尝试了
> test=data.frame(x=c(1,2,3,4,5), y=c(5,4,3,2,1))
> cor(rank(test))
Run Code Online (Sandbox Code Playgroud)
(为简单起见,只有2列,实际数据有5列)
> Error in cor(rank(test)) : supply both 'x' and 'y' or a matrix-like 'x'
Run Code Online (Sandbox Code Playgroud)
我认为这是因为rank需要一个向量.所以我试过了
> cor(lapply(test,rank))
Run Code Online (Sandbox Code Playgroud)
获取应用于数据框中每列的等级,将数据框视为列表,从而产生错误
> supply both 'x' and 'y' or a matrix-like 'x'
Run Code Online (Sandbox Code Playgroud)
我终于得到了一些合作的东西
> cor(data.frame(lapply(test,rank)))
x y
x 1 -1
y -1 1
Run Code Online (Sandbox Code Playgroud)
然而,这似乎相当冗长和丑陋.我认为必须有更好的方法 - 如果是这样的话?
你做错了 - 使用kendall方法参数cor()代替:
R> testdf <- data.frame(x=c(1,2,3,4,5), y=c(5,4,3,2,1))
R> cor(testdf, method="kendall")
x y
x 1 -1
y -1 1
R>
Run Code Online (Sandbox Code Playgroud)
来自help(cor):
因为
cor(),如果方法是"kendall"或"spearman",Kendall的tau或Spearman的rho统计量用于估计基于等级的关联度量.如果数据不一定来自双变量正态分布,则这些更稳健并且已被推荐.因为cov(),非Pearson方法是不寻常的,但为了完整起见.注意,"spearman"基本上计算cor(R(x), R(y))(或cov(.,.))在哪里R(u) := rank(u, na.last="keep").在缺失值的情况下,根据使用的值计算等级,或者基于完整的观察,或者基于每对的重新分配的成对完整性.