4895 8

[数据管理求助] stata中如何让某一组某变量的观测值等于本变量另外组的观测值? [推广有奖]

  • 0关注
  • 8粉丝

已卖:4673份资源

博士生

79%

还不是VIP/贵宾

-

威望
0
论坛币
46839 个
通用积分
9.1015
学术水平
3 点
热心指数
10 点
信用等级
4 点
经验
3759 点
帖子
55
精华
0
在线时间
614 小时
注册时间
2012-7-6
最后登录
2025-11-17

楼主
小皓皓大天天 学生认证  发表于 2020-12-11 20:48:36 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
微信图片_20201211204808.jpg
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Stata tata 观测值

沙发
小皓皓大天天 学生认证  发表于 2020-12-11 20:49:20
首先最左边一列序号,是每一行数据唯一的编号;第二列是组号,图片里显示是4组(每组3个观测值);最后一列是我要得到的核心指标。目前这个指标是纵向排列的,而我现在需要把这个指标按分组横向排列。原来的表格是12行4列.  调整以后应该是变成3行7列 .请问这个操作如何在stata软件里执行   【源数据一共有6600组】

实际上是这样,ID,和ID2都是点的序号。第一组,就是点1到点2、点3,点4的距离;第二组,就是点2到点1、点3和点4的距离,一共有6600个点,最后我要做出来一个6600×6600的表格

藤椅
小皓皓大天天 学生认证  发表于 2020-12-11 21:01:35
我刚才一个思路是这样,
gen B = A if ID == 2
replace B = B[_n+6001] if B ==.
但是没有成功,不知道原因

板凳
DΘstinyじò 发表于 2020-12-12 12:46:16
建议用dataex(ssc install  dataex)命令贴出示例数据。
尝试以下代码:
  1. drop 序号
  2. reshape wide A,i(ID) j(ID2)
复制代码
以图片数据为例
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input double(var1 var2 var3 var4)
  4. 1 1 2 11
  5. 2 1 3 12
  6. 3 1 4 13
  7. 4 2 1 14
  8. 5 2 3 15
  9. 6 2 4 16
  10. 7 3 1 17
  11. 8 3 2 18
  12. 9 3 4 19
  13. 10 4 2 20
  14. 11 4 3 21
  15. 12 4 4 22
  16. end
复制代码
结果为:
IDA1A2A3A4
1111213
2141516
3171819
4202122




报纸
小皓皓大天天 学生认证  发表于 2020-12-13 10:29:03
DΘstinyじò 发表于 2020-12-12 12:46
建议用dataex(ssc install  dataex)命令贴出示例数据。
尝试以下代码:以图片数据为例结果为:
首先谢谢您的回答,不过得到的结果不是我想要的,后面我用matlab直接做出矩阵了

地板
DΘstinyじò 发表于 2020-12-13 13:23:36
小皓皓大天天 发表于 2020-12-13 10:29
首先谢谢您的回答,不过得到的结果不是我想要的,后面我用matlab直接做出矩阵了
示例中您说原来的表格12行4列→调整后3行7列,只是将A堆砌,标识变量ID、ID2失去了作用;
后面您说ID和ID2是点的序号。一共有6600个点,最后做出来一个6600×6600的表格,也就是一个距离矩阵吧。
我是做的这个距离矩阵,只是在A变量赋值时候随便取了一列数据(应该要对应1:2和2:1的值相同,结果则是一个对称矩阵。)
想了解一下您的matlab代码或者示例结果。

7
小皓皓大天天 学生认证  发表于 2020-12-13 16:06:54
DΘstinyじò 发表于 2020-12-13 13:23
示例中您说原来的表格12行4列→调整后3行7列,只是将A堆砌,标识变量ID、ID2失去了作用;
后面您说ID和 ...
我是先利用gis得到了6600个点的经纬度坐标,导出表以后,再用matlab做的
x=[] %x为纬度,按列粘贴
y=[] %y为经度,按列粘贴
A=[x y]  
for i=1:6600
    for j=1:6600
        B(i,j)=distance(A(i,1),A(i,2),A(j,1),A(j,2)); %根据经纬度计算地点间的距离,主要应用distance函数,详细可以百度
    end
end
%B算出来的单位是度。换算成距离的话,需要再乘以Pi/180再乘以6378.2,单位为千米。(此处将地球当做一个球体,半径为6378.2千米)
C=B*pi/180*6378.2  %C即为地点间地理距离矩阵,单位为千米
D=1./C  %D的元素为距离的倒数。即距离数值越小,倒数后构成的权重越大;反之亦然。
D(D==inf)=0  %当矩阵元素为无限大时,将其变为0
%以下行标准化
E=sum(D,2)  %计算各行之和
F=repmat(E,1,6600)  %主要应用repmat函数
W=D./F   %W即为行标准化后的地理距离空间权重矩阵

8
DΘstinyじò 发表于 2020-12-13 20:59:33
小皓皓大天天 发表于 2020-12-13 16:06
我是先利用gis得到了6600个点的经纬度坐标,导出表以后,再用matlab做的
x=[] %x为纬度,按列粘贴
y=[] ...
那我是不是可以理解为,您有6600个点的经纬度信息,计算按行标准化的反距离矩阵?所以是两个问题吧。
假设经纬度变量为lat、lon,尝试一下代码:
  1. global obs=_N
  2. forvalues i = 1(1) $obs {
  3.         local lat_n = lat[`i']
  4.         local lon_n = lon[`i']
  5.         //地表两点距离——C
  6.         globdist dist_`i' , lat0(`lat_n') lon0(`lon_n') worldradius(6371)
  7.         //D
  8.         replace dist_`i'=1/dist_`i'
  9. }
  10. //E
  11. egen dist_row=rowtotal(dist*)
  12. //W
  13. forvalues i = 1(1) $obs {
  14.         replace dist_`i'=dist_`i'/dist_row
  15. }
复制代码

9
reagan 学生认证  发表于 2022-4-3 21:21:50
DΘstinyじò 发表于 2020-12-13 20:59
那我是不是可以理解为,您有6600个点的经纬度信息,计算按行标准化的反距离矩阵?所以是两个问题吧。
...
请问下,您的输出的这个使用dataex吗,那个不是只能输出一些样本数据吗?如何输出的这种命令集

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-6 18:26