通过数据框在 R 中自动执行多项计算
Automate several calculations in R through data frames
我有一系列向量,每个向量都被命名为股票,比如 Facebook Inc. 的 FB。所以我在一个数据框中有 70 多个向量系列,例如 GEEK、IPAS、JCON 等。
对于每对股票,例如 GEEK 和 JCON,我必须计算一个称为互信息的度量。我已经编写了一些代码来找到一对股票的衡量标准,就像那样。
求entropyz
(X,Y的熵,说GEEK和JCON的二元熵returns)
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的熵,比如GEEKreturns)
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的熵,比如JCONreturns)
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
) 的互信息。因此,换句话说,为数据帧上的每一对迭代此代码,从而创建一个成对矩阵。
非常感谢!
如果您创建一个函数 MI
接收两个数据向量和 returns 值,您可以使用类似下面的方法生成一个对称方阵,其中包含结果。如果我们假设您的数据在数据框中 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
函数应用于每个函数并将结果存储在矩阵中。
编辑:
编辑使更清楚
我有一系列向量,每个向量都被命名为股票,比如 Facebook Inc. 的 FB。所以我在一个数据框中有 70 多个向量系列,例如 GEEK、IPAS、JCON 等。 对于每对股票,例如 GEEK 和 JCON,我必须计算一个称为互信息的度量。我已经编写了一些代码来找到一对股票的衡量标准,就像那样。
求entropyz
(X,Y的熵,说GEEK和JCON的二元熵returns)
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的熵,比如GEEKreturns)
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的熵,比如JCONreturns)
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
) 的互信息。因此,换句话说,为数据帧上的每一对迭代此代码,从而创建一个成对矩阵。
非常感谢!
如果您创建一个函数 MI
接收两个数据向量和 returns 值,您可以使用类似下面的方法生成一个对称方阵,其中包含结果。如果我们假设您的数据在数据框中 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
函数应用于每个函数并将结果存储在矩阵中。
编辑: 编辑使更清楚