我想创建一个称为溢漏的变量,该变量的值是每行向量之间的距离之和乘以股票值。例如,考虑
firm us euro asia africa stock year
A 1 4 3 5 46 2001
A 2 0 1 3 889 2002
B 2 3 1 1 343 2001
B 0 2 1 3 43 2002
C 1 3 4 2 345 2001
我想创建一个向量,该向量基本上采用时间t处两个公司之间的距离并生成溢出变量。例如,假设公司A在2001年为0.204588(这是公司A和B在时间t处的余弦距离,即2001年(1,4,3,5)和(2,3,1, 1)(即我们在我们,欧元,亚洲,非洲之间的投资之间的相似性),然后乘以343,然后计算2001年A和C之间的距离为.10528 * 345,因此溢出变量为= 0.2045883 * 343 + A公司2001年的+ 0.1052075 * 345 = 106.4704
我想得到一张包括这样的溢出物的表
firm us euro asia africa stock year spill
A 1 4 3 5 46 2001 106.4704
A 2 0 1 3 889 2002
B 2 3 1 1 343 2001
B 0 2 1 3 43 2002
C 1 3 4 2 345 2001
有人可以建议吗?
以下是stata [https://www.statalist.org/forums/forum/general-stata-discussion/general/1409182-calculating-distance-between-two-variables-and-generating-new-variable]]的代码。我大约有3,000家公司,经营30年。它运行良好,但是非常缓慢。
dt <- data.frame(id=c("A","A","B","B","C"),us=c(1,2,2,0,1),euro=c(4,0,3,2,3),asia=c(3,1,1,1,4),africa=c(5,3,1,3,2),stock=c(46,889,343,43,345),year=c(2001,2002,2001,2002,2001))
答案 0 :(得分:2)
给出有关如何计算相似距离的最少信息,我从Find cosine similarity between two arrays使用了一个公式,该公式将返回与您的数字不同的数字,但应给出相同的结果信息。
我按年份划分数据,以便我们可以比较唯一的ID。我将这些单独的列表作为清单,并使用lapply
来运行for循环,比较所有可能性。
dt <- data.frame(id=c("A","A","B","B","C"), us=c(1,2,2,0,1),euro=c(4,0,3,2,3),asia=c(3,1,1,1,4),africa=c(5,3,1,3,2),stock=c(46,889,343,43,345),year=c(2001,2002,2001,2002,2001))
geo <- c("us","euro","asia","africa")
s <- lapply(split(dt, dt$year), function(a) {
n <- nrow(a)
for(i in 1:n){
csim <- rep(0, n) # reset results of cosine similarity *stock vector
for(j in 1:n){
x <- unlist(a[i,geo])
y <- unlist(a[j,geo])
csim[j] <- (1-(x %*% y / sqrt(x%*%x * y%*%y)))*a[j,"stock"]
}
a$spill[i] <- sum(csim)
}
a
})
do.call(rbind, s)
# id us euro asia africa stock year spill
#2001.1 A 1 4 3 5 46 2001 106.47039
#2001.3 B 2 3 1 1 343 2001 77.93231
#2001.5 C 1 3 4 2 345 2001 72.96357
#2002.2 A 2 0 1 3 889 2002 12.28571
#2002.4 B 0 2 1 3 43 2002 254.00000