计算两个变量之间的距离并生成新变量

时间:2019-05-11 00:08:15

标签: r dplyr data.table

我想创建一个称为溢漏的变量,该变量的值是每行向量之间的距离之和乘以股票值。例如,考虑

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))

1 个答案:

答案 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