楼主: Nina_N
3448 8

[编程问题求助] stata forvalues 循环语句可否出现两个变量 [推广有奖]

  • 0关注
  • 0粉丝

初中生

4%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
39 点
帖子
4
精华
0
在线时间
18 小时
注册时间
2021-7-26
最后登录
2021-9-6

楼主
Nina_N 发表于 2021-7-26 13:01:41 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
有12种疾病的用药数据,每种疾病的用药都分为了4种情况(只用中药, 中西医结合,只用西药,什么都没用)。现在我想求出所有受访者中,这12种疾病,出现过使用中西医结合的情况。例如,只要某个人在疾病a用了中药,疾病b用了西药,这种情况就可算中西医结合; 某人疾病c用了西药,疾病d用了中西医结合,也算;某人疾病e 用了中药,疾病f用中西医结合也算。
我当前已经把这12种疾病重命名为Dis_1, Dis_2... Dis_12。其中,每个疾病中的4种情况分别赋值, 1(只用中药),2(中西医结合),3(只用西药), 4(什么都没用)。 要求12种疾病合并起来的中西医结合的人数,12种病中只报告了个别病的用药情况的也都算,想用循环语句。个人的思路是 forvalues i=1/12, 但同时应该还有个 forvalues j=1/12, 其中条件是 i !=j,  Dis_i==1| Dis_i==2| Dis_i==3, Dis_j==1| Dis_j==2| Dis_j==3, 是并集的状态。
  1. gen medi_usage=.
  2. forvalues i=1/12 {
  3. forvalues j= 1/12 {
  4. replace medi_usage=2 if  (i !=j) & (Dis_i==1| Dis_i==2| Dis_i==3) & (Dis_j==1| Dis_j==2| Dis_j==3)
  5. }
  6. }
复制代码
这个语句有大大的错误,但是不知道该怎么写才对。
刚开始用stata,还不太熟练使用forvalues和暂元语句,求大神们指点!
二维码

扫码加我 拉你入群

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

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

关键词:forvalues forvalue values value Stata Stata stata编程 stata数据处理 STATA数据 stata学习

沙发
wdlbcj 学生认证  发表于 2021-7-26 15:22:18
是不是没有加暂元的原因

gen medi_usage=.
forvalues i=1/12 {
forvalues j= 1/12 {
replace medi_usage=2 if  (`i' !=`j') & (Dis_`i'==1| Dis_`i'==2| Dis_`i'==3) & (Dis_`j'==1| Dis_`j'==2| Dis_`j'==3)
}
}

藤椅
Nina_N 发表于 2021-7-26 16:26:27
wdlbcj 发表于 2021-7-26 15:22
是不是没有加暂元的原因

gen medi_usage=.
谢谢! 我试了下能跑了,用的如下的代码,但是好像结果有点不太对。比如某些行只出现几次==3(使用西药)的情况,就判定为中西医结合(medi_use=2)了。不知道是我的指令逻辑有问题嘛?

  1. gen medi_use=.
  2. forvalues i=1/12 {
  3. forvalues j=1/12 {
  4. replace medi_use=2 if  (`j'!=`i') & (Dis_`j'!= Dis_`i') & (Dis_`i' == 1 | Dis_`i' == 2| Dis_`i' == 3) & (Dis_`j' == 1|  Dis_`j' == 2| Dis_`j' == 3)
  5. }
  6. }
复制代码

板凳
罗润万(|Toby) 学生认证  发表于 2021-7-29 21:28:04
根据以上条件,当任意一种疾病为中西结合,则medi_use=2
且,当两种疾病都不为4时,只要用药情况不同,则medi_use=2
编写以下程序:
gen medi_use=.
forvalues i=1/12 {
replace medi_use=2 if  Dis_`i'==2
forvalues j=1/12 {
replace medi_use=2 if  &  Dis_`i'!=4 &  Dis_`j'!=4 &  Dis_`i' != Dis_`j'
}
}
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员
MarryW + 1 + 1 + 1 精彩帖子

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

报纸
Nina_N 发表于 2021-7-30 14:13:01
罗润万(|Toby) 发表于 2021-7-29 21:28
根据以上条件,当任意一种疾病为中西结合,则medi_use=2
且,当两种疾病都不为4时,只要用药情况不同,则 ...
谢谢!

地板
zdlspace 学生认证  发表于 2021-7-31 03:24:03
不太喜欢用循环,我提供一种不用循环的代码吧,似乎更简洁一点,举个例子,你可以把var改成你的Dis就可以了。
  1. * Example generated by -dataex-. For more info, type help dataex
  2. clear
  3. input double(var1 var2 var3 var4 var5 var6 var7)
  4. 1 3 1 2 2 4 4
  5. 3 4 3 3 3 4 4
  6. 2 4 3 2 3 4 4
  7. 4 3 2 2 3 3 4
  8. 3 3 1 1 3 3 4
  9. 3 3 4 1 3 4 4
  10. 3 4 1 4 1 4 1
  11. 3 3 1 4 4 4 4
  12. 4 3 4 4 4 4 4
  13. 4 3 4 4 4 4 4
  14. 4 3 4 1 4 1 4
  15. 4 3 4 4 4 4 4
  16. end

  17. egen d1=anymatch(var*),v(1)
  18. egen d2=anycount(var*),v(2)
  19. egen d3=anycount(var*),v(3)
  20. gen med_usage=(d1==1|d2==d3==1)
  21. drop d*

  22. list

  23.      +-----------------------------------------------------------+
  24.      | var1   var2   var3   var4   var5   var6   var7   med_us~e |
  25.      |-----------------------------------------------------------|
  26.   1. |    1      3      1      2      2      4      4          1 |
  27.   2. |    3      4      3      3      3      4      4          0 |
  28.   3. |    2      4      3      2      3      4      4          1 |
  29.   4. |    4      3      2      2      3      3      4          0 |
  30.   5. |    3      3      1      1      3      3      4          1 |
  31.      |-----------------------------------------------------------|
  32.   6. |    3      3      4      1      3      4      4          1 |
  33.   7. |    3      4      1      4      1      4      1          1 |
  34.   8. |    3      3      1      4      4      4      4          1 |
  35.   9. |    4      3      4      4      4      4      4          0 |
  36. 10. |    4      3      4      4      4      4      4          0 |
  37.      |-----------------------------------------------------------|
  38. 11. |    4      3      4      1      4      1      4          1 |
  39. 12. |    4      3      4      4      4      4      4          0 |
  40.      +-----------------------------------------------------------+
复制代码

7
zdlspace 学生认证  发表于 2021-7-31 03:29:00
前一个回复写错了,更正一下:
  1. * Example generated by -dataex-. For more info, type help dataex
  2. clear
  3. input double(var1 var2 var3 var4 var5 var6 var7)
  4. 1 3 1 2 2 4 4
  5. 3 4 3 3 3 4 4
  6. 2 4 3 2 3 4 4
  7. 4 3 2 2 3 3 4
  8. 3 3 1 1 3 3 4
  9. 3 3 4 1 3 4 4
  10. 3 4 1 4 1 4 1
  11. 3 3 1 4 4 4 4
  12. 4 3 4 4 4 4 4
  13. 4 3 4 4 4 4 4
  14. 4 3 4 1 4 1 4
  15. 4 3 4 4 4 4 4
  16. end

  17. egen d1=anymatch(var*),v(1)
  18. egen d2=anymatch(var*),v(2)
  19. egen d3=anymatch(var*),v(3)
  20. gen med_usage=(d1==1|d2==d3==1)
  21. drop d*

  22. list

  23.      +-----------------------------------------------------------+
  24.      | var1   var2   var3   var4   var5   var6   var7   med_us~e |
  25.      |-----------------------------------------------------------|
  26.   1. |    1      3      1      2      2      4      4          1 |
  27.   2. |    3      4      3      3      3      4      4          0 |
  28.   3. |    2      4      3      2      3      4      4          1 |
  29.   4. |    4      3      2      2      3      3      4          0 |
  30.   5. |    3      3      1      1      3      3      4          1 |
  31.      |-----------------------------------------------------------|
  32.   6. |    3      3      4      1      3      4      4          1 |
  33.   7. |    3      4      1      4      1      4      1          1 |
  34.   8. |    3      3      1      4      4      4      4          1 |
  35.   9. |    4      3      4      4      4      4      4          0 |
  36. 10. |    4      3      4      4      4      4      4          0 |
  37.      |-----------------------------------------------------------|
  38. 11. |    4      3      4      1      4      1      4          1 |
  39. 12. |    4      3      4      4      4      4      4          0 |
  40.      +-----------------------------------------------------------+
复制代码

8
Nina_N 发表于 2021-7-31 18:09:27
zdlspace 发表于 2021-7-31 03:29
前一个回复写错了,更正一下:
哇,多谢多谢!

9
zdlspace 学生认证  发表于 2021-8-5 12:43:16
Nina_N 发表于 2021-7-31 18:09
哇,多谢多谢!
在提供一个更简洁的代码:
  1. egen d1=rany(*),cond(@==1|@==2&3)
复制代码

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-29 04:26