是否可以加快创建相关矩阵的速度? [英] Is it possible to speed up my function for creating a correlation matrix?

查看:31
本文介绍了是否可以加快创建相关矩阵的速度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了以下函数来使用所谓的Cramér's V估计多项式变量的成对相关性。为此,我使用了vcd包,但据我所知,没有任何现有函数可以从矩阵或类似于cordata.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆