是否可以加快创建相关矩阵的速度? [英] Is it possible to speed up my function for creating a correlation matrix?
本文介绍了是否可以加快创建相关矩阵的速度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我编写了以下函数来使用所谓的Cramér's V估计多项式变量的成对相关性。为此,我使用了vcd
包,但据我所知,没有任何现有函数可以从矩阵或类似于cor
的data.frame
创建V的对称相关矩阵。
该函数为:
require(vcd)
get.V<-function(y){
col.y<-ncol(y)
V<-matrix(ncol=col.y,nrow=col.y)
for(i in 1:col.y){
for(j in 1:col.y){
V[i,j]<-assocstats(table(y[,i],y[,j]))$cramer
}
}
return(V)
}
然而,对于大量的变量,它变得相对较慢。
no.var<-5
y<-matrix(ncol=no.var,sample(1:5,100*no.var,TRUE))
get.V(y)
随着您的增加no.var
计算时间可能会爆炸。由于我需要将其应用于长度为100或更高的data.frame
,我的问题是,是否有可能通过更优雅的编程来"加速"我的函数。谢谢。
推荐答案
您最好像泰勒建议的那样,使用外部的矢量化版本。您仍然可以通过编写一个函数来计算Cramer‘s V来提高性能。assocstats
函数在表上使用summary
,这会计算很多您不想要的统计数据。如果您按照
assocstats
的调用回复给用户定义的函数
cv <- function(x, y) {
t <- table(x, y)
chi <- chisq.test(t)$statistic
cramer <- sqrt(chi / (NROW(x) * (min(dim(t)) - 1)))
cramer
}
这个新函数只计算Cramer‘s V,运行时间大约是assocstats
所需时间的40%。通过将chisq.test
减少到只计算卡方检验统计量,您可能会再次加快速度。
即使您只是调整循环索引值以实现对角线为1的对称矩阵,并使用cv
函数而不是assocstats
,您也可以轻松地将性能提高5倍。
编辑:按照要求,我用来获得4倍速度的完整代码是
cv <- function(x, y) {
t <- table(x, y)
chi <- suppressWarnings(chisq.test(t))$statistic
cramer <- sqrt(chi / (NROW(x) * (min(dim(t)) - 1)))
cramer
}
get.V3<-function(y, fill = TRUE){
col.y<-ncol(y)
V<-matrix(ncol=col.y,nrow=col.y)
for(i in 1:(col.y - 1)){
for(j in (i + 1):col.y){
V[i,j]<-cv(y[,i],y[,j])
}
}
diag(V) <- 1
if (fill) {
for (i in 1:ncol(V)) {
V[, i] <- V[i, ]
}
}
V
}
它看起来与Hadley下面建议的非常相似,尽管他用于获取Cramer‘s V的函数版本在chisq.test
中使用correct = FALSE
。如果所有表都大于2x2,则correct
上的设置无关紧要。对于2x2表,根据参数的不同,结果会有所不同。最好是效仿他的例子,并将其设置为correct = FALSE
,这样无论表的大小如何,所有的计算都是相同的。
这篇关于是否可以加快创建相关矩阵的速度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文