【问题标题】:Automate several calculations in R through data frames通过数据框在 R 中自动执行多项计算
【发布时间】:2016-09-23 12:52:27
【问题描述】:

我有一系列向量,每个向量都被命名为股票,例如 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) 的互信息。因此,换句话说,为数据帧上的每一对迭代此代码,从而创建一个成对矩阵。

非常感谢!

【问题讨论】:

  • 作为起点,获得向量的每个成对组合的一种方法是combn
  • 我已经更新了我的答案,以使其更好,尽管我对如何计算 xlimylim 以及它们是否对每对不同感到很感兴趣。跨度>
  • @jamieRowen 这些限制只是 x 和 y 的范围,即那些时间序列的最小值和最大值。谢谢你的回答。
  • @jamieRowen,我使用了下面的代码,但它不起作用。我有这样命名的行,a, b, c, d, e, (...) z (...) aa, ab (...) ak;所以我使用这个函数来计算 x 和 y 的互信息。因此,当调用代码的最后一部分(应用组合)时,它返回给我,'kde2d(x, y, n = 8, lims = c(xlim, ylim)) 中的错误:数据向量必须相同长度' ;但我所有的向量都有相同的长度;你知道发生了什么事吗?谢谢!
  • @jamieRowen,你知道“xlim”和“ylim”是如何计算的吗?谢谢。

标签: r function loops matrix financial


【解决方案1】:

如果您创建一个函数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 函数应用于其中的每一个,并将结果存储在一个矩阵中。

编辑: 编辑更清楚

【讨论】:

  • @AlexQuintinoBarbi 我的意思是您可以将所有 MI 计算包装在一个采用 x 和 y 的函数中,因为这些是您传递给其他各种函数的东西。在重读您的问题时,我发现我第一次错过了阅读的内容,您说您有 70 个数据框而不是 70 列数据框。但是kde2d 采用值向量,所以我假设每只股票都是一个数据向量,你的数据框每个都是单列吗?你能把它们放在一个数据框中吗?已编辑答案以更清楚我的意思
  • 我编辑了这个问题,以便更清楚地了解它。正如我之前评论的那样,我遇到了两种类型的错误,第一种是“kde2d(x, y, n = 8, lims = c(xlim, ylim)) 中的错误:数据向量必须具有相同的长度”,以及第二个,is.finite(x) 中的错误:未为类型“列表”实现默认方法。对于第一个错误,我认为 x 和 y 的不同范围可能存在一些问题。关于第二个,我想我不知道,因为我没有清单。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多