如果创建函数
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数据帧中所有列指示符的组合。然后我们应用
医疗保险
函数,并将结果存储在矩阵中。
编辑:
编辑以使其更清晰