楼主: tracychen1900
3619 14

[编程问题求助] 急求!如何使用循环语句计算不同观察值同一变量任意相减? [推广有奖]

  • 2关注
  • 1粉丝

大专生

80%

还不是VIP/贵宾

-

威望
0
论坛币
8 个
通用积分
3.0967
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
691 点
帖子
25
精华
0
在线时间
93 小时
注册时间
2016-3-22
最后登录
2020-3-1

10论坛币
求教大神!我有2008和2009年两年患者的门诊就诊数据,想要生成一个变量timegap,等于2008年-2009年期间的任意2次门诊就诊时间之差,如果30≤timegap≤365,即认为患者为我的目标人群。
现在的问题是,不同患者2008年-2009年就诊次数不一样,而且有的次数多达上百次,一条一条手写不现实,请问如何用循环的语句实现我的目标呢?

举例:
序号  患者编号         就诊时间          就诊年份
1             1              2008.10.01      2008
2             1              2008.12.15      2008
3             1              2009.01.10      2009
4             1              2009.05.01      2009
5             2              2008.08.15      2008
6             2              2008.10.01      2008
7             2              2008.12.15      2008
8             2              2008.12.31      2008
9             2              2009.01.31      2009
10           2              2009.05.31      2009
11           2              2009.08.31      2009

对患者编号为1的人,我想实现的是序号1-4这4条记录中,任意两条记录的就诊时间相减,差值满足30≤timegap≤365即可
对患者编号为2的人,我想实现的是序号5-11这7条记录中,任意两条记录时间的差值满足30≤timegap≤365即可

急求循环语句~!谢谢各位大神

最佳答案

关键词:如何使用 循环语句 Mega time Gap Stata 循环语句

回帖推荐

黃河泉 发表于9楼  查看完整内容

请先安装 (ssc install) rangestat,然后:

逍遥梦蝶 发表于3楼  查看完整内容

See below.
已有 1 人评分经验 论坛币 收起 理由
葫芦娃大王 + 1 + 1 鼓励提问

总评分: 经验 + 1  论坛币 + 1   查看全部评分

沙发
逍遥梦蝶 发表于 2018-2-27 02:15:00 |只看作者 |坛友微信交流群
See below.

使用道具

藤椅
tracychen1900 发表于 2018-2-27 02:38:44 |只看作者 |坛友微信交流群
顶一个~

使用道具

板凳
黃河泉 在职认证  发表于 2018-2-27 07:07:51 |只看作者 |坛友微信交流群
尔后建议请用 dataex (先 ssc install dataex 并见说明) 将原始 Stata 资料中具有”代表性”的一部分资料列出,以供有意回答者实验之用,并能提供具体操作指令。并请参考 http://www.jianshu.com/p/9870080fe769,  https://bbs.pinggu.org/thread-5048204-1-1.html, 与 https://bbs.pinggu.org/thread-5917273-1-1.html

使用道具

报纸
tracychen1900 发表于 2018-2-27 13:07:01 |只看作者 |坛友微信交流群
逍遥梦蝶 发表于 2018-2-27 07:01
大神,从34行开始能不能简单说一下思路~我看不太懂命令

使用道具

地板
逍遥梦蝶 发表于 2018-2-27 17:43:25 |只看作者 |坛友微信交流群
tracychen1900 发表于 2018-2-27 13:07
大神,从34行开始能不能简单说一下思路~我看不太懂命令
稍微有一点错误。应该在while循环下再加一层循环,才能计算出所有可能组合的差值。这一步不难,你可以自己尝试一下。

使用道具

7
逍遥梦蝶 发表于 2018-2-27 22:18:53 |只看作者 |坛友微信交流群
  1. *- Input data
  2. cls
  3. clear all
  4. input patient str15 date year
  5. 1 "2008.10.01" 2008
  6. 1 "2008.12.15" 2008
  7. 1 "2009.01.10" 2009
  8. 1 "2009.05.01" 2009
  9. 2 "2008.08.15" 2008
  10. 2 "2008.10.01" 2008
  11. 2 "2008.12.15" 2008
  12. 2 "2008.12.31" 2008
  13. 2 "2009.01.31" 2009
  14. 2 "2009.05.31" 2009
  15. 2 "2009.08.31" 2009
  16. end

  17. *--- 思路 ---*
  18. *
  19. * - 对某一病人任意两次就诊日期做差,依据本人经验,将日期置于一列之内
  20. *   不方便计算。并且,由于有 anymatch() 拓展函数的需要,应该可以将这
  21. *   一长数据转换为宽数据,进行变量间的做差运算。
  22. *
  23. * - 由于不同病人就诊的次数不相同,预期:转化为宽数据后,变宽的变量
  24. *  (本例中是 date 变量)的个数由就诊次数最多的病人决定。就诊次数相对
  25. *   少的病人的就诊日期会有被标记为缺失值。
  26. *
  27. * - 由于日期间隔均是一个较后的日期减去较前的日期,取所有可能的差值组合
  28. *   的方法是:固定住一个较前的日期,用所有较后的日期去减它。比如:固定
  29. *   住 date1,而后有
  30. *      date2 - date1
  31. *      date3 - date1
  32. *      ...
  33. *      date7 - date1
  34. *   类似地,固定住 date2,而后有
  35. *      date3 - date2
  36. *      date4 - date2
  37. *      ...
  38. *      date7 - date2
  39. *   这样的组合理论上应该 = 单一病人就诊次数最大值 * (单一病人就诊次数最大值 - 1)/2
  40. *   需要采取合适的循环结构来解决。

  41. *- Date
  42. gen dt = date(date, "YMD")
  43. format dt %tdCCYY-Mon-DD
  44. drop date year
  45. rename dt date
  46. order date, after(patient)

  47. *- Reshape data
  48. sort patient date
  49. by patient: gen rank = _n
  50. order rank, after(patient)
  51. quiet sum rank
  52. local m = `r(max)'  // 提取出单一病人就诊次数的最大值

  53. reshape wide date, i(patient) j(rank)

  54. *- Calculate pairwise differences
  55. local i = 1
  56. local j = 1
  57. local k = 1
  58. while `i' < `m' {                         // 对减数循环,只要 i 小于单一病人就诊次数最大值就继续循环
  59.    forval j = `=(`i'+1)'/`m' {            // 对被减数循环,被减总是更靠后的日期
  60.        gen diff_`k++' = date`j' - date`i' // 生成日期间隔天数
  61.    }
  62.    local i = `i' + 1
  63. }
  64. drop date*

  65. *- Create indicator
  66. foreach v of varlist diff_* {
  67.    replace `v' = inrange(`v', 30, 365) if !missing(`v')
  68. }
  69. *
  70. egen target = anymatch(diff_*), value(1)
  71. label var target "Enter the sample or not"
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Stakiny + 2 + 2 + 2 热心帮助其他会员
葫芦娃大王 + 10 + 5 + 1 精彩帖子

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

使用道具

8
tracychen1900 发表于 2018-2-27 22:51:04 |只看作者 |坛友微信交流群
逍遥梦蝶 发表于 2018-2-27 17:43
稍微有一点错误。应该在while循环下再加一层循环,才能计算出所有可能组合的差值。这一步不难,你可以自己 ...
还请大神指导一下。。。

使用道具

9
黃河泉 在职认证  发表于 2018-2-28 09:59:10 |只看作者 |坛友微信交流群
请先安装 (ssc install) rangestat,然后:
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input float id str12 ymd float n
  4. 1 "2008.10.01" 1
  5. 1 "2008.10.15" 2
  6. 1 "2008.10.31" 3
  7. 1 "2008.11.15" 4
  8. 2 "2008.08.15" 1
  9. 2 "2008.10.01" 2
  10. 2 "2008.12.15" 3
  11. 2 "2008.12.31" 4
  12. 2 "2009.01.31" 5
  13. 2 "2009.05.31" 6
  14. 2 "2009.08.31" 7
  15. 3 "2009.05.30" 1
  16. 3 "2009.08.31" 2
  17. 3 "XXXX.XX.XX" 3
  18. 3 "2011.09.30" 4
  19. end
  20. gen date = daily(ymd, "YMD")
  21. format date %td

  22. // Robert Picard
  23. rangestat (count)  over=id, by(id) interval(date 30 365)
  24. rangestat (count) under=id, by(id) interval(date -365 -30)

  25. gen inwindow = over < .  | under < .
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Stakiny + 2 + 2 + 2 热心帮助其他会员
葫芦娃大王 + 1 + 1 + 1 精彩帖子

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

使用道具

10
tracychen1900 发表于 2018-2-28 16:53:23 |只看作者 |坛友微信交流群
逍遥梦蝶 发表于 2018-2-27 22:18
谢谢大神!!!!!

使用道具

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

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

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

GMT+8, 2024-5-7 01:27