楼主: 王志敏
3534 19

[编程问题求助] stata循环命令问题 [推广有奖]

  • 1关注
  • 1粉丝

已卖:74份资源

硕士生

82%

还不是VIP/贵宾

-

威望
0
论坛币
31 个
通用积分
16.6185
学术水平
0 点
热心指数
1 点
信用等级
1 点
经验
4291 点
帖子
151
精华
0
在线时间
235 小时
注册时间
2009-2-22
最后登录
2025-3-13

楼主
王志敏 在职认证  发表于 2017-3-6 17:26:37 |AI写论文
50论坛币
现在有变量X_1,x_2,x_3,x_4,x_5,x_6,要生成5个新变量y_1=x_1*x_2*x_3*x_4*x_5*x_6;y_2=x_2*x_3*x_4*x_5*x_6;…;y5=x_5*x_6,如何用一个循环命令解决上述问题?感谢大神点!!!

最佳答案

黃河泉 查看完整内容

Nick Cox 建议
关键词:STATA循环命令 Stata tata 循环命令 新变量 如何

沙发
黃河泉 在职认证  发表于 2017-3-6 17:26:38
Nick Cox 建议
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input float(x_1 x_2 x_3 x_4 x_5 x_6)
  4. 3.6439085  .8855875  2.178382    .13567242  9.159781  .5004264
  5. 4.6231413 .02498507  3.880392     .7207576  8.755236  .5516323
  6.   5.80438 .12259632   5.36664     .0965251  4.605244  .1663715
  7. 7.822571  .5383945  .8250254 .00018472524   5.31311  .4234573
  8. .6603088 .29715487 1.0873007    .35380825  3.255852 .50436085
  9. 2.589655 .05635693  7.182124    .27086043  5.187715  .6142209
  10. 5.666703  .7410993 2.4030285     .5832268  4.603475  .4479784
  11. 1.876804  .6852789  7.749197     .8524442  7.455486 .14944874
  12. 4.2674637  .9836587  9.832918     .8806648 1.1855963  .8706222
  13. .8688191  .6941437  .1651141     .0421818  5.836682 .27148572
  14. end

  15. * code
  16. forval j = 1/5 {
  17.   gen y_`j' = x_6
  18.   quietly forval k = 5(-1)`j' {
  19.     replace y_`j' = y_`j' * x_`k'
  20.   }
  21. }
复制代码

藤椅
王志敏 在职认证  发表于 2017-3-6 19:16:12
非常感谢,[em20][em20][em20][em20][em20]

板凳
wanliliu 发表于 2021-8-9 12:08:44
黃河泉 发表于 2017-3-6 17:26
Nick Cox 建议
黄老师您好!
请帮忙解决循环只执行一次,不能向下执行的问题。谢谢您!到第二个g,drop后的 (g==`t') 就不能变化执行了。试了,不是drop不满足条件中断。
请问这个命令因为什么问题,g=1执行之后就不能执行了呢?g=2更改为符合条件的也不能执行?谢谢

解决的问题:同一公司年度有多个s0701a==1或s0701a==2的seperation值,保留唯一seperation值。
第一步,s0701a==1,seperation不缺失,删除s0701a=2的所有行观测值;然后取s0701a==1,seperation的均值,保留一个seperation值。
第二步,s0701a==1,seperation缺失,删除s0701a==1的所有行观测值;然后取s0701a==2,seperation的均值,保留一个seperation值。

数据如下:
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input str10 codeyear byte s0701a double seperation byte r_tag double(g seperation0 seperation1)
  4. "0000012003" 1       0 1 1       . .
  5. "0000012003" 2       0 1 1       0 .
  6. "0000012004" 1       . 4 2       . .
  7. "0000012004" 2       . 4 2       . .
  8. "0000012004" 2       . 4 2       . .
  9. "0000012004" 2       . 4 2       . .
  10. "0000012004" 2       . 4 2       . .
  11. "0000012016" 1       . 1 3       . .
  12. "0000012016" 2  4.0318 1 3  4.0318 .
  13. "0000012017" 2  4.0696 1 4  4.0696 .
  14. "0000042020" 1  6.8294 2 5       . .
  15. "0000042020" 2  3.9358 2 5  3.4147 .
  16. "0000042020" 2  2.8936 2 5  3.4147 .
  17. "6030002013" 1       0 0 6       . .
  18. "6038832015" 1       0 3 7       . .
  19. "6038832015" 1   .2434 3 7       . .
  20. "6038832015" 1       0 3 7       . .
  21. "6038832015" 2 10.6729 3 7 10.6729 .
  22. end
复制代码

不完整的循环命令,不能执行一次后不能执行:

egen g=group(codeyear )          // g分组
sum g
bys codeyear:  egen  seperation0=mean(seperation)  if  s0701a==2
gen seperation1=.
  cap label variable year "年度"
  cap label variable codeyear "代码年度,唯一标识"
  cap label variable seperation "两权分离率(%)_没有单位"
  cap label variable  s0701a     "1=年报中公布,2=根据股权控制链计算所得"
  cap label variable  r_tag         " codeyear 重复次数"
    dataex
forvalues t=1/7  {
set trace on
   if  (g==`t')  &  (s0701a==1)  & (seperation!=. ){
    drop  if  (g==`t') & (s0701a==2)
     }


循环执行.png (33.33 KB)

循环执行.png

报纸
zdlspace 学生认证  发表于 2021-8-10 03:17:27
你看看这是不是你要的结果
  1. * Example generated by -dataex-. For more info, type help dataex

  2. collapse seperation,by(codeyear s0701a)
  3. bys codeyear:gen wanted=seperation[1] if !mi(seperation[1])
  4. bys codeyear:replace wanted=seperation[2] if mi(seperation[1])
  5. collapse wanted,by(codeyear)

  6. list

  7.     +------------------------+
  8.      |   codeyear      wanted |
  9.      |------------------------|
  10.   1. | 0000012003           0 |
  11.   2. | 0000012004           . |
  12.   3. | 0000012016      4.0318 |
  13.   4. | 0000012017      4.0696 |
  14.   5. | 0000042020      6.8294 |
  15.      |------------------------|
  16.   6. | 6030002013           0 |
  17.   7. | 6038832015   .08113333 |
  18.      +------------------------+
复制代码

地板
wanliliu 发表于 2021-8-12 19:36:54
zdlspace 发表于 2021-8-10 03:17
你看看这是不是你要的结果
谢谢黄老师!帮助很大!
不过,还有两个问题请教:(1)我的循环为什么只能执行一次,之后,如上图,组变量g不根据循环变化?(2)collapse后,seperation只剩下一个均值,如何保留原来的变量和其他许多变量?

循环执行.png (33.33 KB)

循环执行.png

7
zdlspace 学生认证  发表于 2021-8-12 22:16:32
wanliliu 发表于 2021-8-12 19:36
谢谢黄老师!帮助很大!
不过,还有两个问题请教:(1)我的循环为什么只能执行一次,之后,如上图,组变 ...
我不是给你写了代码了吗?不用请教黄老师了,黄老师已经退出论坛了

8
zdlspace 学生认证  发表于 2021-8-13 14:58:01
wanliliu 发表于 2021-8-12 19:36
谢谢黄老师!帮助很大!
不过,还有两个问题请教:(1)我的循环为什么只能执行一次,之后,如上图,组变 ...
你写的循环有问题,你只告诉forval如果满足 (s0701a==1)  & (seperation!=. )时怎么运算,并没有告诉它,如果不满足怎么算。关于collapse如果你要保持原来的所有数据,可以使用gcollapse。代入如下:
  1. clear
  2. input str10 codeyear byte s0701a double seperation byte r_tag double(g seperation0 seperation1)
  3. "0000012003" 1       0 1 1       . .
  4. "0000012003" 2       0 1 1       0 .
  5. "0000012004" 1       . 4 2       . .
  6. "0000012004" 2       . 4 2       . .
  7. "0000012004" 2       . 4 2       . .
  8. "0000012004" 2       . 4 2       . .
  9. "0000012004" 2       . 4 2       . .
  10. "0000012016" 1       . 1 3       . .
  11. "0000012016" 2  4.0318 1 3  4.0318 .
  12. "0000012017" 2  4.0696 1 4  4.0696 .
  13. "0000042020" 1  6.8294 2 5       . .
  14. "0000042020" 2  3.9358 2 5  3.4147 .
  15. "0000042020" 2  2.8936 2 5  3.4147 .
  16. "6030002013" 1       0 0 6       . .
  17. "6038832015" 1       0 3 7       . .
  18. "6038832015" 1   .2434 3 7       . .
  19. "6038832015" 1       0 3 7       . .
  20. "6038832015" 2 10.6729 3 7 10.6729 .
  21. end


  22. gcollapse seperation,by(codeyear s0701a) merge replace
  23. drop if  s0701a==1 & mi(seperation)
  24. gen d1=seperation if s0701a==1
  25. egen tag=min(d1),by(codeyear)
  26. drop if mi(d1) &!mi(tag)

  27. list ,noobs

  28. +-------------------------------------------------------------------+
  29.   |   codeyear   s0701a   seperat~n   r_tag   g   sepera~0   sepera~1 |
  30.   |-------------------------------------------------------------------|
  31.   | 0000012003        1           0       1   1          .          . |
  32.   | 0000012004        2           .       4   2          .          . |
  33.   | 0000012004        2           .       4   2          .          . |
  34.   | 0000012004        2           .       4   2          .          . |
  35.   | 0000012004        2           .       4   2          .          . |
  36.   |-------------------------------------------------------------------|
  37.   | 0000012016        2      4.0318       1   3     4.0318          . |
  38.   | 0000012017        2      4.0696       1   4     4.0696          . |
  39.   | 0000042020        1      6.8294       2   5          .          . |
  40.   | 6030002013        1           0       0   6          .          . |
  41.   | 6038832015        1   .08113333       3   7          .          . |
  42.   |-------------------------------------------------------------------|
  43.   | 6038832015        1   .08113333       3   7          .          . |
  44.   | 6038832015        1   .08113333       3   7          .          . |
  45.   +-------------------------------------------------------------------+
复制代码

9
wanliliu 发表于 2021-8-22 19:07:08
zdlspace 发表于 2021-8-13 14:58
你写的循环有问题,你只告诉forval如果满足 (s0701a==1)  & (seperation!=. )时怎么运算,并没有告诉它, ...
非常感谢您!大牛!
如果不满足条件,什么都不用做,命令是不是只写else,后面什么都不用写?

10
wanliliu 发表于 2021-8-22 19:35:23
zdlspace 发表于 2021-8-13 14:58
你写的循环有问题,你只告诉forval如果满足 (s0701a==1)  & (seperation!=. )时怎么运算,并没有告诉它, ...
谢谢您! gcollapse seperation,by(codeyear s0701a) merge replace
该命令运行后只有一行值了,后续没法做

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

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