全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
2009-12-15 15:15:19
sungmoo 发表于 2009-12-10 20:14
loc m `1'
loc f `2'
loc r `3'
macro shift 3
macro shift 是个好命令,它让我们在利用varlist时可以对变量进行有效的定位。
temfile a
preserve
clear
g xxx=.
save `a'
restore
可以生成一个空的数据文件。
谢谢sungmoo。很佩服您的精益求精的探索精神!
二维码

扫码加我 拉你入群

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

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

2009-12-15 22:27:59
看到sungmoo的关于gsca的两个程式,突发奇想:既然经过syntax定义后的varlist,各个变量都可以通过`1' `2' `3'来引用,干脆不用argsa或loca或temvar来定义,直接用1 2 3来引用算了,谁知一用出错了,再设置一下set trace on 细一看,这才发现1 2 3的所代表的变量发生变化了。看来对变量的引用还是谨慎点好。(也许我是搞错了)改后如下。同时也把log附上,请研究。
r.rar
大小:(3.02 KB)

 马上下载

本附件包括:

  • r.smcl



*前三个变量必须单列(后面的变量可以用缩略式)
cap pr drop gsca
pr gsca
syntax varlist [if] [in]
marksample cond
keep if `cond'
macro shift 3
foreach vi of var `*' {
egen `vi'std=std(`vi')
bys `1' `2' (`3'):egen `vi'e=mean(`vi'std)
bys `1' (`2'):egen `vi'mg=mean(`vi'e)
bys `2 (`1'):egen `vi'fg=mean(`vi'e)
g `vi'sca=`vi'e-`vi'mg-`vi'fg
}
qui keep if `r'==1
end
二维码

扫码加我 拉你入群

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

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

2009-12-16 08:26:26
jzhyue 发表于 2009-12-15 22:27 直接用1 2 3来引用算了,谁知一用出错了,再设置一下set trace on 细一看,这才发现1 2 3的所代表的变量发生变化了
如果用marco shift,`1'、`2'、`3'的意义随之变化,所以上面没有直接引用`1'、`2'、`3'。

(没有限制前三个变量之后的变量的个数)
二维码

扫码加我 拉你入群

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

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

2009-12-16 09:27:22
sungmoo 发表于 2009-12-16 08:26
jzhyue 发表于 2009-12-15 22:27 直接用1 2 3来引用算了,谁知一用出错了,再设置一下set trace on 细一看,这才发现1 2 3的所代表的变量发生变化了
如果用marco shift,`1'、`2'、`3'的意义随之变化,所以上面没有直接引用`1'、`2'、`3'。

(没有限制前三个变量之后的变量的个数)
关于用`1' `2' `3'来尝试表示宏时我理解了以下几点:
1、如sungmoo讲的`1' `2' `3'在用macro shift之后意义随之变化,用1 2 3表示时要注意。
2、用macro shift之后,syntax定义的varlist(or anthing)失去定义,此时可用`*'代表macro shift定义后的宏。
认识错误
3、`*'可以表示syntax or macro定义的宏序列。
4、同类变量命名时最好用前缀。若用后缀:比如由x衍生的变量,当引用x时会产生缩略错误。
以上4点,不知当否,请老师和同学们批评指正。
谢谢!
二维码

扫码加我 拉你入群

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

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

2009-12-16 11:01:18
jzhyue 发表于 2009-12-16 09:27 2、用macro shift之后,syntax定义的varlist(or anthing)失去定义,此时可用`*'代表macro shift定义后的宏
似乎不能这样说。

使用macro shift [#]后,`varlist'的意义并没有变化,而是`1'、`2'、……、`*'的意义变化了。

-------------------------------

stata将syntax(或者所定义的命令)后面的所有内容视作一系列macros(不仅是`varlist'或`anything'),这些macros以空格相区分。而`1'、`2'、……、`*'以及macro shift [#] 针对的就是这一系列macros。

未经macro shift [#],`1'、`2'、……、`*'表示这一系列macros中的第一个、第二个、……、全部macros;

经macro shift [#]后,`1'、`2'、……、`*'表示这一系列macros的剩余部分中的第一个、第二个、……、全部macros。
二维码

扫码加我 拉你入群

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

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

2009-12-16 11:04:59
补充一点:

args针对的也是(syntax或命令后面的)这一系列macros。

args所定义的一系列macros与`1'、`2'、`3'、……的区别在于:

args所定义的macros不受marco shift [#]的影响,而`1'、`2'、`3'、……受marco shift [#]的影响。

不过,它们都不改变`varlist'或`anything'的意义。
二维码

扫码加我 拉你入群

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

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

2009-12-16 11:07:34
jzhyue 发表于 2009-12-16 09:27 4、同类变量命名时最好用前缀。若用后缀:比如由x衍生的变量,当引用x时会产生缩略错误。
这种错误不是必然的,要看程序的具体设计。
二维码

扫码加我 拉你入群

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

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

2009-12-16 11:11:25
插一句,以后不要称“老师”了。

大家都是在学习。
二维码

扫码加我 拉你入群

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

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

2009-12-16 11:15:07
sungmoo 发表于 2009-12-16 11:04
再简单并直观地说,
marco shift [#] 其实只是(随时)定义了`1'、`2'、`3'、……、`*'的意义,而不是改变了原来的`varlist'或`anything'的意义。
但是当macro shift[#]之后`varlist' or `anything' 不能再引用(不存在)
二维码

扫码加我 拉你入群

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

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

2009-12-16 11:37:09
jzhyue 发表于 2009-12-16 11:15 但是当macro shift[#]之后`varlist' or `anything' 不能再引用(不存在)
你可以试一下:

cap pr drop www
pr www
syntax anything
macro shift
n di "`anything'"
n di "`1'"
end
二维码

扫码加我 拉你入群

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

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

2009-12-16 13:08:18
sungmoo 发表于 2009-12-16 11:37
jzhyue 发表于 2009-12-16 11:15 但是当macro shift[#]之后`varlist' or `anything' 不能再引用(不存在)
你可以试一下:

cap pr drop www
pr www
syntax anything
macro shift
n di "`anything'"
n di "`1'     

end
验证`angthing'没有失去定义。

38# sungmoo


恭敬不如从命。


二维码

扫码加我 拉你入群

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

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

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群