r - 通过数据帧在 R 中自动执行多项计算

标签 r function loops matrix financial

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

查找entropyz(X、Y 的熵,例如GEEKJCON 返回的二元熵)

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

最后找到GEEKJCON的相互信息

MI <- entropyx+entropyy-entropyz

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

非常感谢!

最佳答案

如果您创建一个函数 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 x 2 数据框中列索引的所有组合。然后,我们将 MI 函数应用于每个函数并将结果存储在矩阵中。

编辑: 编辑以使其更加清晰

关于r - 通过数据帧在 R 中自动执行多项计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37445243/

相关文章:

r - 如何在向量中获得 "who' 不同”,使用 R

r - geom_segment() x轴上不同的起始值

python - 防止可以使用 "with"调用的类中的方法被调用两次

c - 进行循环工作

r - 有条件地将因子变量 1 的水平替换为特定变量 2

javascript - D3 可缩放旭日不缩放(数据来自 R)

javascript - JavaScript 中的函数有前置属性?为什么?

c - 不带参数的函数与带参数的函数

java - 循环遍历一个文件,一组一行一行

python - 在数据帧上迭代 re.split()