首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算两个变量之间的距离并生成新变量

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

Stack Overflow用户
提问于 2019-05-11 08:08:15
回答 1查看 474关注 0票数 0

我想创建一个名为spill的变量,它是每行向量之间的距离乘以股票价值的和。例如,考虑

代码语言:javascript
运行
复制
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。

我想要一张桌子,包括这样的溢出。

代码语言:javascript
运行
复制
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年的历史。它运行得很好,但速度非常慢。

代码语言:javascript
运行
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-11 10:00:39

给出了关于如何计算相似距离的最小信息,我使用了Find cosine similarity between two arrays中的一个公式,它将返回与您的不同的数字,但应该给出相同的结果信息。

我将数据按年拆分,这样我们就可以比较唯一的ids。我获取这些单独的列表,并使用lapply运行一个for循环来比较所有的可能性。

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56086166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档