我想创建一个名为spill的变量,它是每行向量之间的距离乘以股票价值的和。例如,考虑
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的距离,并生成spill变量。例如,以2001年的公司A为例,它将是0.204588 (这是公司A和B在时间t,即2001年(1,4,3,5)和(2,3,1,1) (即在美国、欧洲、亚洲、非洲的投资之间的相似性)之间的余弦距离,然后乘以343,然后计算2001年公司A和C之间的距离为.10528 * 345,因此公司A的溢出变量是= 0.2045883 * 343+ 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]的代码。我有大约3000家公司,有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))发布于 2019-05-11 10:00:39
给出了关于如何计算相似距离的最小信息,我使用了Find cosine similarity between two arrays中的一个公式,它将返回与您的不同的数字,但应该给出相同的结果信息。
我将数据按年拆分,这样我们就可以比较唯一的ids。我获取这些单独的列表,并使用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.00000https://stackoverflow.com/questions/56086166
复制相似问题