全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
5719 10
2012-10-20
悬赏 30 个论坛币 已解决
我附上了一份excel数据,请各位的帮忙完成以下事情。悬赏价格可以再议。

想要用STATA完成以下任务:
1. 有一组数据记录了一个班的同学在不同日期时的体重;也就是说数据组有三个variables, 其中一个是同学的编号(student id),另外一个是同学的体重(weight),还有一个是记录此体重的日期(date)。
2. 想要用STATA来找到30天以内,哪个同学的体重变化太大。如果变化太大,此数据就属于不正常。假设这个正常的体重变化范围为10斤。比如:一位同学(编号为1179)在2012年1月4号的体重是80斤,在2012年1月14号的体重是100斤,100-80=20斤>10斤,而且2012年1月14号和2012年1月4号之间只有10天,小于30天,所以此同学在2012年1月14号的体重(100斤)是不正常的。
3. 程序最后给出的结果是同学的编号,不正常的体重数据,和此次量体重的日期。在上面的例子中,此处的结果应该给出,编号1179,2012年1月14号,100斤。
注意:
1. 每一位同学都有不同个数的体重数据。比如:编号为1179的同学有11次体重记录,每个记录都是不同日期;而编号为1180的同学有20次体重记录,每个记录在不同日期。

这个数据是我精简了的,我不是很熟悉STATA,但是老师要求必须要用这个软件。我已经把数据按照student id和date排列好了。想在不知道怎么能够对每一个同学的不同时期的体重进行比较。我觉得好像应该用“by"。

请求那位好心的同学能指点一下,用我附上的这一小组数据写一个STATA程序发给我。我自己再琢磨一下。
或者各位有什么思路和用得到的code,请告诉我,谢谢!

附上的数据在此:







最佳答案

sungmoo 查看完整内容

*设初始数据库只有id、date、weight三个变量。显示仅由观测所知的、任意连续30天内、体重变化超10斤的ID: tempfile a g d=date(date,"DM20Y") form d %td bys id (d): g i=_n drop date save `a',replace ren weight weight1 ren d d1 bys id (d1): g n=_N expandcl n,cl(id) gen(j) bys id d1: replace i=_n joinby id i using `a' g a=(abs(d-d1)=10) collapse (sum)a,by(id) n l id if a
二维码

扫码加我 拉你入群

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

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

全部回复
2012-10-20 08:34:16
*设初始数据库只有id、date、weight三个变量。显示仅由观测所知的、任意连续30天内、体重变化超10斤的ID:

tempfile a
g d=date(date,"DM20Y")
form d %td
bys id (d): g i=_n
drop date
save `a',replace

ren weight weight1
ren d d1
bys id (d1): g n=_N
expandcl n,cl(id) gen(j)
bys id d1: replace i=_n

joinby id i using `a'
g a=(abs(d-d1)<=30)*(abs(weight-weight1)>=10)
collapse (sum)a,by(id)
n l id if a
二维码

扫码加我 拉你入群

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

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

2012-10-20 09:09:07
用by可以的,这个by用来区分每位同学,可以简化思路,
接下来就是比较日期,日期的function应该有可以计算天数。

不过,我觉得这个有一点小难处,也是可能的问题,
30天内,可能量了好几次,譬如三次,第一次和第二次比,增5斤,第二次和第三次比,又增6斤,
然而,第一次和第三次比,那这样算??????应该是不正常?


二维码

扫码加我 拉你入群

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

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

2012-10-20 09:40:15
h3327156 发表于 2012-10-20 09:09
用by可以的,这个by用来区分每位同学,可以简化思路,
接下来就是比较日期,日期的function应该有可以计算 ...
我就是卡在算法这里了。不知道怎么写程序。如果你有思路,能麻烦用我提供的数据写一个简单的STATA 程序吗?谢谢!
二维码

扫码加我 拉你入群

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

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

2012-10-20 10:11:14
insheet using statadata.csv,name clear   %我转化为csv文件,比较容易导入,date格式改为Y-M-D

gen date1=date(date,"YMD")
format date1 %td                               %将文本型date赋值给date1,date1为日期格式
sort student_id date1                           %排序

by student_id:gen date_b=date1[1]
by student_id:gen weight_b=weight[1]   %分组,确定每组的日期和体重的起点
gen delta=date1-date_b                        %计算天数
gen weight_perday=(weight-weight_b)/delta if delta ~=0     %如果天数不为0,计算每天体重增加值
replace weight_perday=0 if delta==0                                  %如果天数为0,体重增加为0
keep if abs(weight_perday)> max                    %max自定义,即每天体重增长超过max即为不正常
二维码

扫码加我 拉你入群

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

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

2012-10-20 11:08:52
空山空语 发表于 2012-10-20 10:11
insheet using statadata.csv,name clear   %我转化为csv文件,比较容易导入,date格式改为Y-M-D

gen da ...
谢谢解答,但是问题是,只有”30天内,体重上下浮动大于10斤“这个衡量标准,所以不能用weight_perday这个来筛选。但是我想知道能不能把weight_b(也就是体重的起点)用foreach或者for value来设置成第一天的体重,第二天的体重,第三天的体重,等等等,以此类推。然后根据每一个体重的起点来计算体重差(weight-weight_b)。也就是创造n组(n是指每一个同学的体重记录个数)体重差。同理,得出对应的n个日期差。然后按照两两对应的”体重差“和”日期差“筛选出符合”30天内,体重上下浮动大于10斤“这个衡量标准的同学。 但是STATA里面的foreach和其它程序的for loop好像不一样,所以我不太会。

还有,您的data1为什么是missing values呢?但还是非常感谢!
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群