楼主: 皖山一流
2579 8

[编程问题求助] stata母程序与子程序设计困扰(子程序需要继承很多参数) [推广有奖]

  • 4关注
  • 13粉丝

已卖:216份资源

讲师

25%

还不是VIP/贵宾

-

威望
0
论坛币
2357 个
通用积分
156.2410
学术水平
73 点
热心指数
80 点
信用等级
54 点
经验
16517 点
帖子
352
精华
0
在线时间
308 小时
注册时间
2013-12-9
最后登录
2021-1-21

楼主
皖山一流 学生认证  发表于 2016-4-25 23:34:13 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币




当代码行很多的时候,如果利用子程序,进行模块化编程的话,好处多多:美观、便于维护、易懂等。
但是、、、当子程序需要继承母程序很多暂元的时候,就很费劲了
如下例子:
pro define 母程序
  loc i=
  loc j=
  loc str1=
  loc str2=
  ...
end

pro define 子程序
syntax  ...   //这里为了继承母程序的很多参数,不得不设置很多选项,杂乱的选项让人犯朦。。。。。
end


这个时候应该怎么办呢?
希望指导我的编程设计思维~~
二维码

扫码加我 拉你入群

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

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

关键词:Stata 程序设计 tata 子程序 DEFINE 子程序 变成 母程序 继承

士不可不弘毅,任重而道远~

沙发
夏目贵志 发表于 2016-4-26 09:30:19
用syntax是比较好的办法。这个也是stata比较通行的办法。除此之外有两个选择:
一个是用return的值,比如predict命令会用到regress命令保留的return和/或ereturn的值。
另一个是用global macro。这个比较不推荐,因为用户可能会自定义同名的global macro。

藤椅
皖山一流 学生认证  发表于 2016-4-26 09:49:01 来自手机
噢,没有太明白~syntax我一直在用,可是跟处理好子程序的很多输入参数有帮助?
利用返回值的话,那得整个程序运行完毕才可以吧~

板凳
夏目贵志 发表于 2016-4-26 09:59:00
皖山一流 发表于 2016-4-26 09:49
噢,没有太明白~syntax我一直在用,可是跟处理好子程序的很多输入参数有帮助?
利用返回值的话,那得整个 ...
回复的话请点右下角的回复按钮,不然是没有回复提醒的。

如果你的“子程序”是主程序执行过程中(而不是像regress和predict这种)执行的话,的确是不适合用return这个方法。那现有的就只有三种选择,一个是让子程序处理syntax, 一个是用local macro,一个是用global macro。前两个方法比较推荐。

报纸
皖山一流 学生认证  发表于 2016-4-26 15:47:56
夏目贵志 发表于 2016-4-26 09:59
回复的话请点右下角的回复按钮,不然是没有回复提醒的。

如果你的“子程序”是主程序执行过程中(而不 ...
您对bysort了解吗,bysort(recall)的话,虽然可以分组逐组执行,但是发现定义的暂元只在第一次有效,当执行到之后的组时,就消失了,很是愁人。。。。

地板
夏目贵志 发表于 2016-4-27 23:22:56
皖山一流 发表于 2016-4-26 15:47
您对bysort了解吗,bysort(recall)的话,虽然可以分组逐组执行,但是发现定义的暂元只在第一次有效,当 ...
我不太清楚你具体要解决什么问题。recall那个部分不理解。但是bysort的功能自己编程也是很好实现的。如果对bysort不满意的话自己写个循环应该就可以完美解决了。bysort的代码我没实际看过。

7
皖山一流 学生认证  发表于 2016-4-28 02:04:47
夏目贵志 发表于 2016-4-27 23:22
我不太清楚你具体要解决什么问题。recall那个部分不理解。但是bysort的功能自己编程也是很好实现的。如果 ...
恩,您说得对,自己可以做个循环,以前我以玩过,
但是,发现自己写的循环,运行速度远没有内部-bysort-快,,
貌似超过50组以上的话,几乎只能看到表示进度的圈圈转圈

8
夏目贵志 发表于 2016-4-30 00:25:21
皖山一流 发表于 2016-4-28 02:04
恩,您说得对,自己可以做个循环,以前我以玩过,
但是,发现自己写的循环,运行速度远没有内部-bysort- ...
确实是。不过虽然相对来说慢,绝对时间并不是很长的样子。你看一百万观测值,50类,自己写个循环也就不到一分钟就执行完了。
  1. clear
  2. timer clear
  3. set obs 1000000
  4. gen order = _n
  5. gen cat = round(mod(runiform()*500,50))
  6. gen x = runiform()
  7. timer on 1
  8. bys cat: egen meanx = mean(x)
  9. timer off 1
  10. noi timer list 1
  11. drop meanx
  12. timer on 2
  13. sort cat
  14. levelsof cat
  15. local levels = r(levels)
  16. gen meanx2 = .
  17. foreach level in `levels' {
  18.         cap drop tmp
  19.         egen tmp = mean(x) if cat==`level'
  20.         replace meanx2 = tmp if cat==`level'
  21. }
  22. cap drop tmp
  23. timer off 2
  24. noi timer list 2
复制代码
结果是
  1.    1:      0.52 /        1 =       0.5200
  2.    2:     26.85 /        1 =      26.8500
复制代码

9
皖山一流 学生认证  发表于 2016-5-1 17:37:30
嗯,不错,还是可以接受的,呵呵,
PS:我用stata14做的测试,发现要慢很多,timer 2 达到124s~~
之前也做过其他的测试,发现14在计算方面比13慢一点,
不晓得,14版哪些贩方面有所提升~~

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-6 14:28