我想为每个市政府计算最近的气象站的加权平均温度。我有关于每个车站和每个市镇的纬度和经度的数据。
我尝试使用命令mipolate执行此操作,但它只允许在一个维度上执行此操作。
我使用命令spatwmat使用距离计算空间权重矩阵,但它似乎与mipolate等命令兼容。
有没有人有想法?
谢谢!
PS:我使用STATA 14
答案 0 :(得分:1)
我的答案有点迟,但迟到总比没有好。
幸运的是,去年我遇到了这个问题,当时我的任务是为超过750个地区(在你的情况下类似于县级)设置天气数据集,而越南只有120个气象站数据。在进入解决方案之前,我们只是描述一下我的数据。
需要的是2个分离的数据文件。第一个是每个地区的经度,纬度,第二个是每个气象站的纬度。区域数据由750个观测值组成,每个观测值显示1个区域。气象站数据也一样。
我的解决方案是计算每个地区与每个气象站之间的距离。然后,该信息可用于确定每个区的每个站的权重。例如:距离A区仅3公里的A站的温度将比30公里外的A站的重量更大。如何计算重量取决于您计算的距离数据。我计算了所有这些,但由于复杂的越南地形,我的教授坚持只使用最近车站的数据。因此,对于我的情况,如果使用距离< = 50 (km),则只有一个简单的下降。
现在如何做部分。首先,使用区域数据作为与站数据合并的多对多(m:m)的基础数据。通过使用m:m合并,每个地区将与120个气象站合并。因此,结果是一个数据文件包含750 * 120个观测值,以及每个地区和气象站的纬度,经度上的4个主要变量。有了这些坐标,没有什么能阻止我们计算所需的距离。
我们在寻找什么叫做Haversine公式。它计算两个已知坐标之间的距离,经度和纬度用弧度单位表示。
Here is the formula (I just joined so I still don't know to to emblem Latex code to comment yet)
如果您的数据格式目前采用度数,分钟格式,则可以使用STATA中的以下代码转换为弧度单位(度和分钟以分开的变量表示)。
gen radian_longtitude_station = ( ///
(degree_longtitude*3600 ///
+ ///
minute_longtitude*60 ///
)/3600 ///
)*_pi/180
gen radian_latitude_station = ( ///
(degree_latitude*3600 ///
+ ///
minute_latitude*60 ///
)/3600 ///
)*_pi/180
此后,您可以将坐标应用于公式并计算每次观测的距离,地球的半径为 r = 6,371 km, phi_1 ( lambda_1 )和 phi_2 ( lambda_2 )是每个点的弧度纬度和经度。
由于您使用的是STATA,因此可以使用由Bill Rising创建的名为 sphdist 的程序包,以解决Haversine公式中的这个特殊问题。有关详细信息,请参阅https://ideas.repec.org/c/boc/bocode/s372502.html。 用法非常简单:
sphdist, lat1(radian_latitude_district) ///
lon1(radian_longtitude_district) ///
lat2(radian_latitude_station) ///
lon2(radian_longtitude_station) ///
radians ///
units(km) ///
gen(distance)
最后,我们得到的是一个数据集如下
District | Station | Distance | (Weather variables) ...
A | C | 2 |
A | D | 10 |
A | F | 300 |
B | C | 200 |
B | D | 1 |
B | F | 30 | ........................
现在由您来决定如何根据每个地区与每个车站之间的距离来计算重量。
Here is the link to my example dataset:(不包括天气变量以节省空间)
希望您觉得这很有帮助。这是上午5点哈哈,对不起,如果我在语法上犯了任何错误。