【问题标题】:Create a matrix from variables using subsequent values使用后续值从变量创建矩阵
【发布时间】:2021-06-13 08:58:31
【问题描述】:

我在 Stata 中有 3 个变量的数据,一个字符串 id 和数字变量(GPS 数据 - 纬度和经度)。我想通过以下方式(下表)将变量转换为矩阵,以计算所有组合的两个 id-spots 之间的距离。因此,新创建的后续列(例如,id_1)具有原始变量(例如,id)的后续(i+1)值,依此类推。但是,以下命令仅在到达第 n 行以获取值之前有效;然后后续的新行变为空。因此,矩阵的下半部分丢失了(上表:///)。对于 2000 年的观察结果:

foreach num of numlist 1/2000 {
   foreach var of varlist id num1 num2   {
        gen `var'_`num'=`var'[_n+`num']
    }
}

【问题讨论】:

  • 您的具体目标是创建 6000 个新变量,每个变量有 2000 个观测值,以便以后计算 (2000 x 1999) / 2 = 1999000 距离。如果后者是目标,请考虑例如geonear 来自 SSC。如果你想要旅行距离,有几个现有的社区贡献的命令,例如search distance
  • 假设您有 2000 个观察值。那么任何对whatever[2001] 或后续观察中的值的引用都是合法的,但只是返回缺失,因为没有这样的观察。
  • 谢谢尼克。我在没有意识到你的回复的情况下删除了帖子,因为我自己认为我可以使用“扩展 2”复制整个数据集并运行命令,然后删除不需要的。这样我就可以拥有整个矩阵数据。我需要整个矩阵而不是半对角线。是的,我使用了 geodist,效果很好。再次感谢您的建议!

标签: loops variables matrix stata


【解决方案1】:

如果有人发现任何用途,我会发布答案。

//duplicate all observation to create all filled matrix

expand 2, gen(dupindex) 

forvalue i = 1/1999 {
    foreach var of varlist id num1 num2 {
    gen `var'`i'=`var'[_n+`i']
        }
}

//delete the unnecessary columns & rows

forvalue i = 2000/3999 {
    drop id`i' num1`i' num2`i'  
}
drop in 2001/3999
drop dupindex

【讨论】:

  • 很高兴您找到了解决方案。请将其标记为已解决。
猜你喜欢
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2012-07-10
  • 2013-11-18
相关资源
最近更新 更多