我有一个实际的数据帧(df)列= 2000和行= 10000。为简单起见,我将使用1行和10列的虚拟df来描述我的问题。我想计算df的每个单元的KLD。每行的每个索引除以该行的总和,因此如果我将row1
视为向量,那么它将总结为1
。为了计算Kullback-Leibler散度(KLD),我们需要2个向量总和为1.在我的情况下,计算df[1,1]
的KLD,vector1
将是第一行,vector2
将具有与vector1
(10)相同的长度,其中索引1将包含值1
,而所有其他值将是0
。
df <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
KLD <- function(A, B) {
sum(A * ifelse(B > 0, log(A/B), 0))
}
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
KLD(vector1, vector2)
类似地,为了计算df[1,2]
的KLD,vector1将再次是row1,vector2将是长度为10的向量,其中索引2将是1而所有其他值将是0。
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0)
KLD(vector1, vector2)
依此类推,我为df中的每个元素计算CHILD。
任何人都可以帮我这个,我怎么能把这个函数迭代到df的每个索引。非常感谢您的帮助。
编辑:
以下是计算我的df的每个指数的KLD的总步数
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0)
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0)
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 1, 0, 0, 0, 0, 0, 0)
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0)
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0)
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 0, 0, 1, 0, 0)
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0)
vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
在这里你可以看到,对于第1行,向量1每次都保持不变,它只是向量2的变化。
final output will be something like:
output
[1] -0.2297388 -0.1297385 -0.1051967 -0.2051999 -0.1051975 -0.1853967 -0.1151998 -0.1051967 -0.2251954 -0.1651990
如果你有一个数据帧df
:
row1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
row2 <- c(0.64, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04)
df<-rbind(row1,row2)
还有一组向量,您希望为每行df使用输入进行KLD计算:
vector1<- c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
vector2 <- c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0)
vectors<-rbind(vector1,vector2)
您可以使用df
对vector1
的每一行进行计算,例如apply()
:
KLD <- function(A, B) {
sum(A * ifelse(B > 0, log(A/B), 0))
}
apply(df,1,FUN=KLD,B=vector1)
你可以使用嵌套的apply()
为集合中的每个向量做到这一点:
metaKLD <- function(vect) {
apply(df,1,FUN=KLD,B=vect) # this makes the calculation for each row of df with a given vector
}
apply(vectors,1,FUN=metaKLD) # this makes it happen for each vector of the set