代码之家  ›  专栏  ›  技术社区  ›  Alex Quintino Barbi

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

  •  2
  • Alex Quintino Barbi  · 技术社区  · 8 年前

    我有一系列向量,每一个都被命名为股票,比如Facebook股份有限公司的FB。所以我在一个数据帧中有70多个向量系列,例如GEEK、IPAS、JCON等。 对于每一对股票,例如GEEK和JCON,我必须计算一个称为“相互信息”的度量值。我已经做了一些代码,在一对股票上找到了这个度量,就像这样。

    要查找 entropyz (X,Y的熵,即 笨蛋 联合通信网络 退货)

    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的熵 笨蛋 退货)

    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的熵 联合通信网络 退货)

    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
    

    最后,为了找到 笨蛋 联合通信网络

    MI <- entropyx+entropyy-entropyz
    

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

    谢谢!

    1 回复  |  直到 8 年前
        1
  •  2
  •   jamieRowen    8 年前

    如果创建函数 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^2x2数据帧中所有列指示符的组合。然后我们应用 医疗保险 函数,并将结果存储在矩阵中。

    编辑: 编辑以使其更清晰