图书学习打卡:stata软件教程(人大十八讲)(6) 第六章程序

    科技2022-07-11  118

    第六章 程序

    ####以下代码为stata中输入 **6.1标准的程序文件 sysuse auto , clear summarize log on tab forei log close **6.2创造自己的命令:与stata相互问候 capture program drop hello program hello display “你好,兄弟” // 注意此引号为中文输入 end **6.3暂元 sysuse auto, clear list price length weight in 1/5 local v3 "price length weight" //将 price length weight 这组字符赋给暂元名 v3 list `v3' in 1/5 local cmd "list" //list 这组字符赋给暂元名 cmd `cmd' `v3' in 1/5 //等价于 list price length weight in 1/5 local pre "pri" //将 pri 这组字符赋给暂元名 pre `cmd' `pre' tab rep`=26*3' //等价于 tab rep78, 注意到 26*3=78 *类似地可以使用 global 来定义暂元 sysuse auto, clear list price length weight in 1/5 global v3 "price length weight" //将 price length weight 这组字符赋给暂元名 v3 list $v3 in 1/5 //等价于 list price length weight in 1/5global cmd "list" //list 这组字符赋给暂元名 cmd $cmd $v3 in 1/5 //等价于 list price length weight in 1/5 **Global 与 local 的区别 capt prog drop myprog program myprog //定义程序 myprog local i="主程序局域" //定义局域暂元 i global j="主程序全局" //定义全局暂元 j di as txt "`i' " //调用局域暂元 i,这里是显示暂元名 i 中的内容“主程序局域”,绿色 di as txt "$j" //调用全局暂元 j,这里是显示暂元名 j 中的内容“主程序全局”,绿色 mysub //执行子程序体 mysub di as error "`i' " //再次调用局域暂元 i,显示暂元名 i 中的内容“主程序局域” di as error "$j" //再次调用全局暂元 j,显示 “子程序全局暂元” ,红色 end capt prog drop mysub prog mysub //定义子程序 myprog local i="子程序局域" //定义子程序中的局域暂元 i global j="子程序全局" //定义子程序中的全局暂元 j di as result "`i'" //调用局域暂元 i,这里是显示暂元名 i 中的内容“子程序局域暂元” di as result "$j" //调用全局暂元 j,这里是显示暂元名 j 中的内容“子程序全局暂元” end myprog //执行主程序体 myprog **6.4 自带命令参数 captu prog drop listargs prog listargs di "第一个参数为: `1' " di "第二个参数为: `2' " di "第三个参数为: `3' " di "第四个参数为: `4' " end listargs listargs I love stata listargs "I love stata" //区别 local i "I love stata" //区别 listargs `i' listargs this is a test listargs "this is a test" listargs "this is" "a stata test" 5 **另一个办法是采用参数申明的方式。 captu prog drop listargs prog listargs args a b c d di "第一个参数为: `a' " di "第二个参数为: `b' " di "第三个参数为: `c' " di "第四个参数为: `d' " end listargs this is a test listargs "this is a test" **6.5 scale 标量 ** scalar a=2 //赋予标量 a 的值为 2 dis a+2 //a+2=2+2=4 scalar b=a+3 //b=a+3=2+3=5 di b //结果窗口显示出:5 scalar s=”hello” //标量也可以为字符型 di s //结果窗口显示出: hello clear set obs 3 input a 1 3 5 end scalar b=3 gen v1=a*b //回忆线性代数,该命令相当于对 a 的每个值乘 b(3) list input b 2 3 4 end gen v2=a*b //注意 v1 与 v2 这两个命令完全相同 list //v1 与 v2 结果不同,表明 STATA 优先进行变量相乘 gen v3=a*scalar(b) //当 b 即是变量名又是标量名时,标量相乘时要指明标题 list ** sysuse auto, clear sum price return list //计算结果同时被存入到如下的标量中 local sum=r(sum) //将总和存入一个叫 sum 的暂元中 di `sum' **6.6 临时变量和临时数据文件:tempvar 和 tempfile ***** clear set obs 5 tempvar x y //指明临时变量名为 x 和 y gen `x'=_n //生成临时变量`x’,取值为 1,2,3,4,5 gen `y'=_N //生成临时变量`y’,取值为 5,5,5,5,5 edit //查看数据编辑器,却并没有变量 gen z=`x'+`y' //将两个临时变量相加,得到新变量 z edit //查看数据库,只有新变量 z ***** use auto, clear preserve //表明下面的操作将不破坏当前数据中的文件 keep price weight //仅保留 price 和 weight 这两个变量 save master, replace //保存新数据文件 master,该数据包含两个变量 drop weight //再去掉变量 weight,当前数据中只剩一个变量 weight save part1,replace //保存新数据文件 part1,该数据包含一个变量 use master, clear drop price rename weight price append using part1 erase master.dta erase part1.dta restore //回到 preserve 命令之前的数据集,即 auto ****** /*这是一个坏程序,因为中间性数据文件 master 和 part 并不是我们想要的,即使最后有 erase 命令将其删除,一旦在此前强行退出,仍会导致这两个不必要的文件占用空间并造成混乱。*/ ****** preserve keep price weight tempfile master part1 save “`master’” drop weight save “`part1’” use “`master’”, clear drop price rename weight price append using “`part1’” restore /*在这种情形下,无论是出现运行错误还是中途中止,都不会破坏原数据文件,也不会产生 垃圾文件。*/
    Processed: 0.016, SQL: 8