楼主: breeze112
5333 10

求助STATA数据管理问题(有悬赏!) [推广有奖]

  • 0关注
  • 0粉丝

高中生

35%

还不是VIP/贵宾

-

威望
0
论坛币
688 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
200 点
帖子
24
精华
0
在线时间
23 小时
注册时间
2012-1-27
最后登录
2018-6-15

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,请告诉我,谢谢!

附上的数据在此:
STATA数据管理.xlsx (8.88 KB)






最佳答案

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
关键词:STATA数据 求助stata Stata 管理问题 tata excel 记录

回帖推荐

sungmoo 发表于6楼  查看完整内容

*设初始数据库只有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
沙发
sungmoo 发表于 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
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
gongxuhong110 + 1 + 1 + 1 谢谢

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

藤椅
h3327156 发表于 2012-10-20 09:09:07 |只看作者 |坛友微信交流群
用by可以的,这个by用来区分每位同学,可以简化思路,
接下来就是比较日期,日期的function应该有可以计算天数。

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


使用道具

板凳
breeze112 发表于 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即为不正常
等待

使用道具

地板
breeze112 发表于 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呢?但还是非常感谢!

使用道具

7
breeze112 发表于 2012-10-20 14:56:22 |只看作者 |坛友微信交流群
sungmoo 发表于 2012-10-20 08:34
*设初始数据库只有id、date、weight三个变量。显示仅由观测所知的、任意连续30天内、体重变化超10斤的ID:
...
太谢谢了! 我一行一行看了一遍你的程序,得到的就是我想要的结果~ 可是能不能解答我三个疑问:
1. tempfile 怎么用? 我看了help里的解释,还是不太明白。
2. joinby id using 'a' 这一条我不太懂。为什么要在id 后面加上i ? i 整个程序里面是什么作用呢?
3. n l id if a这一行if后面的a 是数值还是true or false? if a 表示的是只要a有数,就显示id吗?

初步适应STATA中,请见谅。再次谢谢你!

使用道具

8
sungmoo 发表于 2012-10-20 16:54:04 |只看作者 |坛友微信交流群
3. n l id if a这一行if后面的a 是数值还是true or false? if a 表示的是只要a有数,就显示id吗?
if的用法参见:https://bbs.pinggu.org/thread-1423352-1-1.html

使用道具

9
sungmoo 发表于 2012-10-20 16:58:12 |只看作者 |坛友微信交流群
1. tempfile 怎么用? 我看了help里的解释,还是不太明白
tempfile后面跟一个随便起的宏(macro,暂元)的名称。对临时文件的操作(生成、使用、保存、代换等),要以宏的形式(`a'表示临时文件)。——这里涉及宏的用法。

使用道具

10
sungmoo 发表于 2012-10-20 17:01:37 |只看作者 |坛友微信交流群
2. joinby id using 'a' 这一条我不太懂。为什么要在id 后面加上i ? i 整个程序里面是什么作用呢?
*注意a的前后引号并不同(https://bbs.pinggu.org/thread-1278006-1-1.html

joinby id i using `a'

*基本思路即,实现各组内各观测值两两相互比较。
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 100 + 10 + 1 + 1 + 1 热心帮助其他会员!

总评分: 经验 + 100  论坛币 + 10  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

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

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

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

GMT+8, 2024-5-22 18:58