楼主: aixueguanli
4510 8

[数据管理求助] 求stata代码,求当前酒店附近500米内邻居的数目 [推广有奖]

  • 1关注
  • 0粉丝

硕士生

76%

还不是VIP/贵宾

-

威望
0
论坛币
143 个
通用积分
2.5500
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
1525 点
帖子
65
精华
0
在线时间
224 小时
注册时间
2016-7-20
最后登录
2024-8-8

200论坛币
我现在有5000个酒店的地理坐标,现在想要计算每一家酒店附近邻居的数目。假设id为1的酒店500米内有3个酒店,id为1 的这一行后面就显示为3。
下图是我的数据截图示例。
我有个大体的思路,要嵌套一个for循环。但是不知道具体该怎么做,求大神帮忙
foreach i in id{

gen neighbor(`i')=0
foreach i in id{
geodist lat lon lat(`i') lon(`i'), gen(distance)
replace neighbor(`i')=neighbor(`i')+1 if distance<0.310685596119
}
}

微信图片_20200804110329.png

最佳答案

DΘstinyじò 查看完整内容

试一下以下代码。关于globdist和geodist的说明,二者在算法上有略微差异,globdist的地球半球默认是自动,使用数据中平均纬度的地球半径,geodist默认是6371km,当然二者分别使用选项worldradius、 radius可做统一。半径统一的基础上还是有些许不同,geodist还需加入 sphere选项,二者计算结果就会相同。具体的细微差异,可以自行选择。 选择globdist命令是因为它可以定一个基准位置,然后一次计算基准位置与变量中其他位置的距离 ...
关键词:Stata tata Distance foreach replace
沙发
DΘstinyじò 发表于 2020-8-4 11:14:28 |只看作者 |坛友微信交流群
试一下以下代码。
  1. ///没有globdist的话先安装
  2. ///net install globdist, from(http://homepages.rpi.edu/~simonk/stata/)
  3. qui gen neighbor=.
  4. local obs = _N
  5. forvalues i = 1(1)`obs' {
  6. local lat_n = lat[`i']
  7. local lon_n = lon[`i']
  8. globdist dist_`i', lat0(`lat_n') lon0(`lon_n')
  9. qui count if dist_`i'<= 0.5
  10. qui replace neighbor =`r(N)'-1 if id==`i'
  11. drop dist_`i'
  12. }
复制代码
关于globdist和geodist的说明,二者在算法上有略微差异,globdist的地球半球默认是自动,使用数据中平均纬度的地球半径,geodist默认是6371km,当然二者分别使用选项worldradius、 radius可做统一。
  1. globdist ... ,worldradius(6371)
复制代码
半径统一的基础上还是有些许不同,geodist还需加入 sphere选项,二者计算结果就会相同。具体的细微差异,可以自行选择。
选择globdist命令是因为它可以定一个基准位置,然后一次计算基准位置与变量中其他位置的距离,用循环来构造距离矩阵数据。geodis可计算二点间的距离,多对情况下,需要手动构造出相应成对的位置再进行计算。
具体可以help globdist了解。

使用道具

藤椅
aixueguanli 学生认证  发表于 2020-8-6 21:51:45 |只看作者 |坛友微信交流群
DΘstinyじò 发表于 2020-8-5 16:04
试一下以下代码。
关于globdist和geodist的说明,二者在算法上有略微差异,globdist的地球半球默认是自动, ...
您好,感谢您的回答。我还有个问题,想请教一下,我更新了下数据,目前实际酒店数目是30000多个,我跑数据的时候报错了
qui tab hotelid
too many values
r(134);
我看了下这个问题。
Search of official help files, FAQs, Examples, SJs, and STBs

[P]     error . . . . . . . . . . . . . . . . . . . . . . . .  Return code 134
        too many values
        1) You attempted to encode a string variable that takes on
        more than 65,536 unique values.  2) You attempted to tabulate
        a variable or pair of variables that take on too many values.
        If you specified two variables, try interchanging them.
        3) You issued a graph command using the by option.  The
        by-variable takes on too many different values to construct
        a readable chart.

(end of search)
我看这个问题显示60000以下都可以,为什么3万不行啊。
我想请教一下,这个问题如何解决

使用道具

板凳
aixueguanli 学生认证  发表于 2020-8-6 23:00:43 |只看作者 |坛友微信交流群
DΘstinyじò 发表于 2020-8-4 11:14
试一下以下代码。
关于globdist和geodist的说明,二者在算法上有略微差异,globdist的地球半球默认是自动, ...
你好,我的酒店数目扩展到了30000个,报错了
. qui tab hotelid
too many values
r(134);
我看这个错误的描述,说是60000内就可以,为什么3万就不行了呢?
请问怎么解决合适呢

使用道具

报纸
DΘstinyじò 发表于 2020-8-7 12:44:30 |只看作者 |坛友微信交流群
aixueguanli 发表于 2020-8-6 23:00
你好,我的酒店数目扩展到了30000个,报错了
. qui tab hotelid
too many values
我修改了回答,第一段命令的4、5行。就是你的hotelid标识要唯一就可以了,这一步就是要知道一下酒店个数。

使用道具

地板
aixueguanli 学生认证  发表于 2020-8-7 22:22:21 |只看作者 |坛友微信交流群
DΘstinyじò 发表于 2020-8-7 12:44
我修改了回答,第一段命令的4、5行。就是你的hotelid标识要唯一就可以了,这一步就是要知道一下酒店个数。 ...
您好,今天我跑了这个代码,发现有23个酒店返回的neighbor是-1,这个结果我很反常。麻烦帮忙再确认一下。
另外,希望你在能在这个代码中,加入两行,计算一下每个酒店所有邻居的平均得分。我每个酒店都有rating,您做一个累加,再除一下总的neighbor数即可。
另外,麻烦你在回答本条后,申请一下奖励,我还想再感谢一下您。
真的太麻烦您了。

使用道具

7
DΘstinyじò 发表于 2020-8-9 16:25:15 |只看作者 |坛友微信交流群
aixueguanli 发表于 2020-8-7 22:22
您好,今天我跑了这个代码,发现有23个酒店返回的neighbor是-1,这个结果我很反常。麻烦帮忙再确认一下。 ...
我之前生成3000对随机坐标数,也出现了-1的情况,查看了之后发现的问题是:
以id=1758 出现-1为例,以id为1758的经纬度为基准位置,计算与经纬度变量中的其他位置的距离生成变量dist_1758时候出现missing,发生在与基准位置自身计算距离的时候,也就是dist_1758[1758]==.,实际上应该为0,不知道为什么会出现这种情况,第9行count一步的时候出现0,实际上应该为1,第10行出现-1,实际上应该为0。
初步的推测是local lat_n = lat[`i']、local lon_n = lon[`i'] 后,`lat_n' 与lat[`i']和`lon_n' 与lon[`i']的计算出现不完全相等的情况,计算机本身精度的原因。
然后,我前天私信你了新的算法,可能你没看到?我先修改的这里,后为了节省运行时间和避免出现上述分析的-1情况,私信了新的算法。

使用道具

8
DΘstinyじò 发表于 2020-8-9 17:48:11 |只看作者 |坛友微信交流群
aixueguanli 发表于 2020-8-7 22:22
您好,今天我跑了这个代码,发现有23个酒店返回的neighbor是-1,这个结果我很反常。麻烦帮忙再确认一下。 ...
为了避免上述分析的问题,globdist 一步的时候在经纬度范围内选取时候剔除自身位置。
因为在计算经纬度范围的时候用了6371,
  1. globdist ... ,worldradius(6371)
复制代码
所以globdist加了worldradius(6371)选项。
新的计算neighbor的平均得分的代码也私信你了,假设你有得分变量rating表示酒店得分,nei_rating就是所求变量。

使用道具

9
317792209 在职认证  学生认证  发表于 2024-8-1 16:31:10 |只看作者 |坛友微信交流群
思路:直接根据经纬度坐标生成半径500米的邻接矩阵,然后对邻接矩阵按行求和。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-5 16:24