通过数据帧自动执行R中的多个计算

时间:2016-05-25 18:43:47

标签: r function loops matrix financial

我有一系列向量,每个向量都被命名为股票,就像Facebook for Facebook一样。所以我在数据框中有超过70个向量系列,例如GEEK,IPAS,JCON等。 在每对股票上,例如GEEK和JCON,我必须计算一个称为互信息的指标。我已经做了一些代码来找到一对股票的衡量标准,就像那样。

要查找entropyz(X,Y的熵,说 GEEK JCON 的双变量熵返回)

denz<-kde2d(x,y, n=512, lims=c(xlim,ylim))
z<-denz$z
cell_sizez<-(diff(xlim)/512) * (diff(ylim)/512)
normz<-sum(z)*cell_sizez
integrandz<-z*log(z)
entropyz<-sum(integrandz)*cell_sizez
entropyz<-entropyz/normz

要查找entropyx(X的熵,说 GEEK 返回)

denx<-kde(x=x,gridsize = 512, xmin=xlim[1], xmax = xlim[2])
zx<-denx$estimate
cell_sizex<-(diff(xlim)/512) 
normx<-sum(zx)*cell_sizex
integrandx<-zx*log(zx)
entropyx<-sum(integrandx)*cell_sizex
entropyx<-entropyx/normx

要查找entropyy(Y的熵,说 JCON 返回)

deny<-kde(x=y,gridsize = 512, xmin=ylim[1], xmax = ylim[2])
zy<-deny$estimate
cell_sizey<-(diff(ylim)/512) 
normy<-sum(zy)*cell_sizey
integrandy<-zy*log(zy)
entropyy<-sum(integrandy)*cell_sizey
entropyy<-entropyy/normy

最后,找到 GEEK JCON

的互信息
MI <- entropyx+entropyy-entropyz

所以,我找到了X和Y(上面两个股票)的互信息。但是我必须为70多只股票(向量)计算这个度量,70 * 69/2次迭代= 2415;它就像制作一个相关矩阵,因为它是成对比较。 问题是,如果有人知道让R在我的数据集中找到所有对(x,y)的互信息的方法。换句话说,为数据帧上的每一对迭代此代码,从而创建成对矩阵。

非常感谢!

1 个答案:

答案 0 :(得分:2)

如果您创建一个函数MI,它接收您的两个数据向量并返回值,您可以使用类似下面的内容来生成带有结果的对称方阵。如果我们假设您的数据在我们可以做的数据框df

MI = function(x,y,xlim,ylim){
  denz<-kde2d(x,y, n=512, lims=c(xlim,ylim))
  z<-denz$z
  cell_sizez<-(diff(xlim)/512) * (diff(ylim)/512)
  normz<-sum(z)*cell_sizez
  integrandz<-z*log(z)
  entropyz<-sum(integrandz)*cell_sizez
  entropyz<-entropyz/normz

  denx<-kde(x=x,gridsize = 512, xmin=xlim[1], xmax = xlim[2])
  zx<-denx$estimate
  cell_sizex<-(diff(xlim)/512) 
  normx<-sum(zx)*cell_sizex
  integrandx<-zx*log(zx)
  entropyx<-sum(integrandx)*cell_sizex
  entropyx<-entropyx/normx

  deny<-kde(x=y,gridsize = 512, xmin=ylim[1], xmax = ylim[2])
  zy<-deny$estimate
  cell_sizey<-(diff(ylim)/512) 
  normy<-sum(zy)*cell_sizey
  integrandy<-zy*log(zy)
  entropyy<-sum(integrandy)*cell_sizey
  entropyy<-entropyy/normy

  return(entropyx+entropyy-entropyz)
}
df = data.frame(1:10,1:10,1:10,1:10,1:10)
matrix(
  apply(
    expand.grid(
      seq_along(df),seq_along(df)),1,
    FUN = function(i,j) MI(df[,i],df[,j],xlim,ylim)
    ),
  nrow = ncol(df)
)

这是有效的,因为expand.grid为您提供了n ^ 2乘2数据帧中所有列指示的组合。然后,我们将MI函数应用于每个函数,并将结果存储在矩阵中。

修改 编辑更清楚