楼主: eblog
10398 43

[编程问题求助] Stata编程(讨论4) [推广有奖]

  • 0关注
  • 45粉丝

贵宾

情多累美人

已卖:2565份资源

院士

79%

还不是VIP/贵宾

-

威望
8
论坛币
3893966 个
通用积分
735.4915
学术水平
142 点
热心指数
182 点
信用等级
92 点
经验
73666 点
帖子
2284
精华
3
在线时间
1891 小时
注册时间
2006-3-20
最后登录
2025-12-25

楼主
eblog 发表于 2010-1-31 14:46:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
以下代码仅供例示:

cap prog drop test
prog define test
  clear all
  args t1 t2
  local i=`t2'-`t1'
  set obs `i'
  gen x=`t1'*`t2'
  save test.dta
end

如何使用syntax语法命令控制t1和t2,使得(1)t2必须大于t1,且(2)t1、t2须为正,最后(3)还允许加上选项以控制是否保存数据,如: test 1 5 默认保存数据文件,而 test 1 5, nosave 则不保存?
二维码

扫码加我 拉你入群

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

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

关键词:stata编程 Stata tata SYNTAX DEFINE 讨论 Stata

已有 2 人评分学术水平 热心指数 信用等级 收起 理由
liutangliu + 1 + 1 + 1 好的意见建议
swuferuc + 1 精彩帖子

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

本帖被以下文库推荐

沙发
arlionn 在职认证  发表于 2010-1-31 16:57:37
*! Given by Yu-Jun Lian   arlionn@163.com
*! 2010.01.31
cap program drop test
program define test
version 10
syntax anything [, Nosave Filename(string)]
  clear
  local s : word count `anything'
  if `s'!=2{
    dis as error "Only two numbers can be specified!"
    exit
  }
  tokenize `anything'
  if `1'<0|`2'<0{
    dis as error "the numbers must be positive!"

    exit
  }
  if `1'>=`2'{
    dis as error "the numbers must be in ascending ordering!"
    exit
  }
  local i = `2' - `1'
  set obs `i'
  gen x = `1'*`2'
  if "`filename'" == ""{
    local filename "test"
  }
  if "`nosave'" == ""{
    save `filename'.dta, replace
  }
end



测试结果:

. test 10 20 30
Only two numbers can be specified!

. test 10
Only two numbers can be specified!

. test 10 5
the numbers must be in ascending ordering!

. test 10 50, file(mytest)
obs was 0, now 40
(note: file mytest.dta not found)
file mytest.dta saved
已有 3 人评分学术水平 热心指数 信用等级 收起 理由
swuferuc + 1 + 1 精彩帖子
jzhyue + 1 + 1 + 1 精彩帖子
eblog + 2 + 5 + 3 我很赞同

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

藤椅
eblog 发表于 2010-1-31 17:48:19


呵呵,可做为编程标准范例
另外,可以限定anything为数值型吗?

板凳
arlionn 在职认证  发表于 2010-1-31 18:02:06
看看 assert 命令的帮助,附加如下语句

qui cap assert sqrt(`1')!=.
if _rc {
   dis as error "the input must be numeric!"
}
qui cap assert sqrt(`2')!=.
if _rc {
   dis as error "the input must be numeric!"
}
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
eblog + 1 + 3 + 3 我很赞同

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

报纸
sungmoo 发表于 2010-2-1 08:43:13
*若把两个数字放入必选项中,可省略几行(但输入命令时要多输入几个字符);另外控制了不能同时输入ns与s:
cap pr drop ntest
pr ntest
qui{
  clear all
  syntax ,n(numlist >0 asc min=2 max=2) [ns s(str)]
  if "`ns'"!=""&"`s'"!=""{
    n di as error "ns and s should not be input together"
    exit
  }
  token `n'
  local i=`2'-`1'
  set obs `i'
  gen x=`1'*`2'
  if "`ns'"==""{
    if "`s'"!="" save `s',replace
    else save test,replace
  }
}
end
已有 3 人评分学术水平 热心指数 信用等级 收起 理由
liutangliu + 1 + 1 + 1 好的意见建议
eblog + 2 + 5 + 1 我很赞同
jzhyue + 1 + 1 + 1 精彩帖子

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

地板
eblog 发表于 2010-2-1 10:56:15
sungmoo 发表于 2010-2-1 08:43
*若把两个数字放入必选项中,可省略几行(但输入命令时要多输入几个字符);另外控制了不能同时输入ns与s:
cap pr drop ntest
pr ntest
qui{
  clear all
  syntax ,n(numlist >0 asc min=2 max=2) [ns s(str)]
  if "`ns'"!=""&"`s'"!=""{
    n di as error "ns and s should not be input together"
    exit
  }
  token `n'
  local i=`2'-`1'
  set obs `i'
  gen x=`1'*`2'
  if "`ns'"==""{
    if "`s'"!="" save `s',replace
    else save test,replace
  }
}
end
楼上代码形成如:ntest, n(1 8) s(test)  的命令格式
如果能改成这种格式:ntest 1 8, s(test)  就更好了

7
sungmoo 发表于 2010-2-1 10:59:39
eblog 发表于 2010-2-1 10:56 楼上代码形成如:mytest, n(1 8) s(test) 的命令格式
如果能改成这种:mytest 1 8, s(test) 就更好了
stata似乎没有内在的对"syntax anything"进行约束的方法。

8
eblog 发表于 2010-2-1 11:01:31
sungmoo 发表于 2010-2-1 10:59
eblog 发表于 2010-2-1 10:56 楼上代码形成如:mytest, n(1 8) s(test) 的命令格式
如果能改成这种:mytest 1 8, s(test) 就更好了
stata似乎没有内在的对"syntax anything"进行约束的方法。
谢谢,我就是找不到这种约束方法

9
sungmoo 发表于 2010-2-1 11:11:27
这里有一个困难在于:若用syntax anything,anything其实也可以包括variable。

10
arlionn 在职认证  发表于 2010-2-1 11:20:49
sungmoo 发表于 2010-2-1 08:43
*若把两个数字放入必选项中,可省略几行(但输入命令时要多输入几个字符);另外控制了不能同时输入ns与s:
cap pr drop ntest
pr ntest
qui{
  clear all
  syntax ,n(numlist >0 asc min=2 max=2) [ns s(str)]
  if "`ns'"!=""&"`s'"!=""{
    n di as error "ns and s should not be input together"
    exit
  }
  token `n'
  local i=`2'-`1'
  set obs `i'
  gen x=`1'*`2'
  if "`ns'"==""{
    if "`s'"!="" save `s',replace
    else save test,replace
  }
}
end
事实上,eblog 所设定的 Nosave 选项不是最佳的选择,若设定成 Save(filename) 会比较符合常规,呵呵。

另,sungmoo,虽说把 t1, t2 放到选项中,在写程序时可省略几行,但用的时候稍微麻烦一些。我有点奇怪,为何stata的syntax标准格式中只提供 syntax varlist, syntax namelist 这类的东东,若能提供 syntax numlist 这样的格式我们就不用这么费事了,呵呵。或许是stata考虑到,多数的操作都是以“变量”为基础的吧。

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

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