[原创]stata吐槽和单步调试程序

这里只有作者精心编写的研究经历!
回复
头像
hellohappy
网站管理员
网站管理员
帖子: 269
注册时间: 2018年11月18日, 14:27
Been thanked: 1 time

#1 [原创]stata吐槽和单步调试程序

未读文章 hellohappy » 2019年4月10日, 23:51



目录:
    前言:
    吐槽:
    单步调试:set trace on


前言:

    stata对普通用户是很友好的,只要几个很基础的字母,就能做很多事。大部分的经济学研究方法、计量都能找到相对权威的命令。但是,stata对编程用户可以说是十分坑爹,想要用来编程做自己的事情的时候,会发现,很难入手。虽然这样的好处是,能写stata内部程序的(内部程序一般就不是指你平时写的 reg y x 这种语句了,他指的是reg这个命令的编写),一般都是更加专业或者熟悉stata的人,从而一定程度上保证了非官方命令的权威和可靠性。

吐槽:

    1.stata的暂元策略

        临时暂元(以前我以为“暂元”这个名词和“暂”字有关,所以默认他就是local命令,后来知道其实global命令也是暂元。临时暂元就是local,长期暂元是global) 存储的就是一个文本,提取符号是 ` ' 。对于暂元,十分不符合正常程序员的思维逻辑形式,而且对于复杂的大型程序,越写,越不知道后面的变量是什么意思。因为如果大型程序要你多次提取暂元的暂元的暂元。你的变量命名就会变得十分奇怪或者十分长。同时,有时候临时暂元会被系统删除?? 我遇到过用循环命令生成暂元,结果出了循环就没有了。好吧,那我只好用长期存储命令global,他和local类似,只不过系统不会删,去哪都能调用,提取方法是前面加 $ 。结果这个和local不能连着用。这应该是有歧义导致的。比如这个命令: 

Code: 全选

local i = 1
global beta1 "666"
//我想要提取beta1的值666
display "$beta`i'"
display $"beta`i'"
//上面两条都不行,你只能用另一个暂元先存着,再提取
local temp "beta`i'"
display "$`temp'"
    2.stata的括号,一定要换行使用。

        这个没什么很严重的后果,只是有时候我只有一句命令,却一定要换个行,命令一多,整个程序就很长。

    3.官方命令写的太庞大

        如果某个官方命令不符合你的需求,你想改,难度很大,因为你不知道他到底还和哪些命令的哪些细节有交集。比如,我想要修改 estimates 这个命令。当某个回归结果 a 并没有用 est store 保存下来的时候,也就是 estimates store 并没有保存结果 a ,我希望 estimates命令仍然能把结果打印出来(打印为空就行了嘛,为什么一定要报错。),而不是直接报错。不小心瞄了几眼官方命令 estimates 。程序实在是太难懂,而且还关联别的命令。

    4.某些奇怪的限制

        比如,est store 这个命令,最多只能存储300个回归结果。话说普通版限制就好了嘛,为什么SE和MP版也限制300?我内存这么大,为什么不给我存多几个结果?est的官方命令好像看不懂也不会改,就很难受。

    5.没有简单的数组

        首先stata是有数组的,但不直观,必须要先看懂 mata 的帮助文件。然而meta帮助长的不行。

    6.出错时报告的是个数字,没有其他信息。

        报告个数字就意味着,你知道你错的是某一类错误,而不能明确知道错了啥。同时没有给出错在哪一行,有时候真的很麻烦。
        比如有时候就是不小心中文英文标点符号弄错了,结果一定要从头读到尾才知道错了哪里。
        再举个例子,运行某命令前没有生成暂元 i ,但是后文我用到了 暂元` i' 。stata直接报错,内容是语法错误。应该是由于默认暂元不存在,那暂元提取的结果就是空,这个空的内容加进去刚好出现语法错误。如果这个错误是最外层命令出错,一般你能通过结果的上下句判断错在哪,但是如果你这个错误发生在循环的内部,你就找不到了!你只能单步调试!单步调试还不是那种设置断点什么的,他只是给你一条条运行,并告诉你运行到哪里了。同样的,如果你的命令包含大量循环,你会得到一堆垃圾信息。

单步调试:

    单步调试的命令是 set trace on ,关闭是 set trace off 。更多内容自行查看帮助。help trace
help trace
Show
Title
    [P] trace -- Debug Stata programs

Syntax
    Whether to trace execution of programs
        set trace { on | off }

    Show # levels in tracing nested programs
        set tracedepth #

    Whether to show the lines after macro expansion
        set traceexpand { on | off } [, permanently ]

    Whether to display horizontal separator lines
        set tracesep { on | off } [, permanently ]

    Whether to indent lines according to nesting level
        set traceindent { on | off } [, permanently ]

    Whether to display nesting level
        set tracenumber { on | off } [, permanently ]

    Highlight pattern in trace output
        set tracehilite "pattern" [, word ]

Description
    set trace on traces the execution of programs for debugging.  set trace off turns off tracing after it has been set on.
    set tracedepth specifies how many levels to descend in tracing nested programs.  The default is 32000, which is equivalent to infinity.
    set traceexpand indicates whether the lines before and after macro expansion are to be shown.  The default is on.
    set tracesep indicates whether to display a horizontal separator line that displays the name of the subroutine whenever a subroutine is entered or exited.  The default is on.
    set traceindent indicates whether displayed lines of code should be indented according to the nesting level.  The default is on.
    set tracenumber indicates whether the nesting level should be displayed at the beginning of the line.  Lines in the main program are preceded with 01; lines in subroutines called by the main program, with 02; etc.  The default is off.
    set tracehilite causes the specified pattern to be highlighted in the trace output.

Options
    permanently specifies that, in addition to making the change right now, the traceexpand, tracesep, traceindent, and tracenumber settings be remembered and become the default settings when you invoke Stata.
    word highlights only tokens that are delimited by nonalphanumeric characters.  These would include tokens at the beginning or end of each line that are delimited by nonalphanumeric characters.



 

Link:
Hide post links
Show post links

hufei_lt
帖子: 3
注册时间: 2019年8月19日, 07:03

#2 Re: [原创]stata吐槽和单步调试程序

未读文章 hufei_lt » 2019年8月20日, 18:25

您好 麻烦您在有空的时候看一下我这段循环有什么问题 
forval i = 2/3651{
bysort v1: egen W3_sum_ `i'= sum(W3) if stkcd==`i'
}

报错为 
2 invalid name

感谢

Link:
Hide post links
Show post links

头像
hellohappy
网站管理员
网站管理员
帖子: 269
注册时间: 2018年11月18日, 14:27
Been thanked: 1 time

#3 Re: [原创]stata吐槽和单步调试程序

未读文章 hellohappy » 2019年8月22日, 00:29

你好,我没仔细运行你的程序,但是看了一下这里多了一个空格 :
W3_sum_ `i'
这句话如果加了空格,stata无法将他识别为一个变量名字。我估计你这里是把这个东西当作一个变量名字吧。

最后,因为你这个帖子和主帖是无关的,等你看到我的回复以后,请通知我删掉最近这两帖。

Link:
Hide post links
Show post links


回复