【问题标题】:How to create high quality reproducible examples in Stata如何在 Stata 中创建高质量的可重现示例
【发布时间】:2018-11-22 21:22:15
【问题描述】:

花了一年多的时间在 上回答问题后,我很清楚,在这里提问的绝大多数人大多是 Stack Overflow 的新用户或临时用户。此类用户更有可能将此网站与 Statalist 等传统论坛混淆,并发布不清楚或离题的问题。

这些用户通常:

  1. 不太熟悉 Stata 的界面和语言约定,提出的问题可以通过查阅帮助文件轻松回答
  2. 在不提供任何上下文的情况下询问如何做某事
  3. 转储未格式化的代码 sn-p 没有 cmets、神秘的变量名称和拼写错误
  4. 未能提供真实的数据示例
  5. 忽略描述他们期望的结果

这个问题的动机是类似问题的成功 PandasR 提供一站式初学者资源。有经验的用户提供的示例似乎增加了(新)提问者获得问题答案的机会。

您对创建高质量的 可重现示例有何建议?

可以使用edit 命令输入简单的数据集,该命令将打开 变量编辑器,并允许用户手动输入或粘贴数据。

以编程方式,也可以使用input 命令:

clear

input id str5 name income
1 "Tracy" 90000
2 "Ramon" 70000
3 "Kevin" 80000
end

list

     +---------------------+
     | id    name   income |
     |---------------------|
  1. |  1   Tracy    90000 |
  2. |  2   Ramon    70000 |
  3. |  3   Kevin    80000 |
     +---------------------+

在使用input 提供示例数据方面是否还有其他提示? 什么时候应该使用tracepause 命令?还有哪些信息 应该包括吗?

【问题讨论】:

    标签: stata stata discussion


    【解决方案1】:

    恭喜您为您的 Stata 编程问题寻求帮助!

    承认你需要他人的意见是迈向的第一步 解决它并成熟为Stata用户/程序员。写一个好问题不是一件小事,需要经验。后者伴随着实践,而这又需要毅力。

    编写高质量可重现的 Stata 问题的秘诀是 成功创建沙盒示例。这应该使用最短的 可能的代码 sn-p 和所需的最少示例数据 复制你的问题。

    Stack Overflow 的 Stata 志愿者总是乐于提供帮助,但他们不会随意喂食。您的努力不足会降低您获得答案的可能性,并增加您的 Stata 问题被关闭并最终删除的机会。


    改进问题的提示

    您可以通过单击上方左侧的星号 ⭐ 将此主题添加到您最喜欢的问题列表中。这样您就可以轻松地再次从您的个人资料的收藏选项卡中访问这些提示。

    • 我是 Stata 新手,还不知道它的命令

    在发布问题之前,请确保您已阅读入门 与Stata。您可以通过在 Stata 的命令提示符下键入 help gs 来访问这些介绍性手册。

    熟悉基本概念是无可替代的 和Stata的语法。这一点尤为重要,因为有效的沟通要求您能够与 Stack Overflow 上其他更有经验的 Stata 用户说相同的语言。

    不要忘记这些用户想要回答有趣的编程问题, 而不是充当教授基础知识的导师。 Statalistreddit 等更通用的论坛可能更适合解决与基本命令使用相关的问题。

    • 我想在 Stata 中做[某事],我需要代码

    Stack Overflow 旨在解决特定编程问题。因此,您必须尽可能清楚地解释您的情况并向我们展示您的尝试。

    1. 首先明确说明您的问题并告诉我们您的 Stata 版本和平台(Windows、Mac、Linux)。

    2. 然后给出一些上下文。这应该着重于用文字简明扼要地描述 您的数据集和您正在尝试做的事情。

    3. 接下来告诉我们您是如何尝试实现目标的。这个阶段包括 附上您使用的代码和生成的输出。您还应该链接到您在线咨询过的任何类似问题。

    4. 最后向我们提供示例数据以运行代码并重现您的问题。这些数据不应使用屏幕截图显示!有关此步骤的帮助,请参阅下文。

    5. 始终响应 cmets 要求潜在回答者的澄清。

    • 我在 R/Python/SAS/SPSS 中有这段代码,在 Stata 中也需要同样的代码

    询问如何将其他语言的代码翻译成 Stata 的 adomata 语言仅当且仅当存在特定问题时才有效 在尝试的Stata代码中解决。因此,上一节和下一节中列出的所有项目在这里也都是相关的。

    • 这是我使用的 Stata 代码,但它不起作用

    1. 检查脚本中的拼写错误both 和 在您问题中提供的代码 sn-p 中。 Stata 解释器是无情的:看似简单的编程任务很快就会变成一种令人沮丧的练习。 Stack Overflow 上的 Stata 志愿者不是来寻找因粗心打字而导致的拼写错误。

      例子:

      locla mymacro HELLO
      genrate var = 5
      

      local mymacro HELLO
      generate var = 5
      
    2. 最好不要缩写命令,避免全部删掉 空白。这使得代码更难阅读并且更容易出错。其他 没有经验的用户也可能会发现即使是基本命令也难以识别。

      例子:

      forval i=1/5 {
      loc mymacro`i' HELLO `i'
      g var`i'=`i'
      }
      

      forvalues i = 1 / 5 {
          local mymacro`i' HELLO `i'
          generate var`i' = `i'
      }
      
    3. 不要发布整个do 文件或代码段,而只发布有问题的部分。此外,请确保使用代码块正确格式化代码。如果您的代码 sn-p 超过 5 或 6 行,如有必要,请将其分成几部分。如果您使用的变量的名称不是一目了然,请提供 cmets。

      例子:

      系统使用自动
      德斯
      总和mpg
      gen mempg=r(平均值)
      gen smpg=r(sum)
      reg mpg 重量长度

      /* load data */
      
      sysuse auto
      describe
      
      /* descriptive statistics */
      
      summarize mpg
      generate mean_mpg = r(mean)
      generate sum_education = r(sum)
      
      /* regression analysis */
      
      regress mpg weight length
      

    1. 请务必查看帮助文件以获取有关代码失败原因的线索。问题通常是由无效的语法引起的。您可以通过在 Stata 的命令提示符中键入 help command/function name 来访问命令和函数的帮助文件。

      例子:

      list, separate(0)
      option separate() not allowed
      r(198);
      

      在这里,输入help list 表明这不是合法的语法。实际上,选项的名称是separator(#) 而不是separate(#)

    1. 在您在这里提问之前,请尝试自行调试代码。 Stata 具有有用的调试命令,例如set trace(有关更多详细信息,请参阅help trace),它显示了代码如何实时执行。另一个有用的调试命令是pause,它会暂时挂起代码的执行(help pause 了解更多信息)。

      例子:

      set trace on
      
      forvalues i = 1 / 2 {
          display `i'
      }
      
      - forvalues i = 1 / 2 {
      - display `i'
      = display 1
      1
      - }
      - display `i'
      = display 2
      2
      - }
      

      如果您的问题不是明显的语法错误,请使用这些命令,并在您的问题 selected 中包含相关输出,这可能会更清楚地说明问题的原因。此外,请始终包含 Stata 报告的完整错误代码和消息

    1. 如果您使用的是您拥有的 community-contributed 命令 从 SSC、Stata Journal 或其他来源下载的,请务必在问题的早期指出这一点。这样一来,可能会回答的人就不会浪费时间在外部网站上寻找它,并且可以更快地发现与此命令相关的问题。

    • 这是我的 Stata 数据集的屏幕截图

    请勿上传截图!

    屏幕截图没有您希望的那么有用,主要是因为它们不允许可能回答的人将数据复制并粘贴到他们自己的 Stata 中并尝试重现问题。

    除了本主题的问题部分中概述的editinput 命令之外,还有四种其他方法可以为您的Stata 问题提供示例数据。

    1. 如果您的数据是机密的,您可以使用 sysuse 命令加载 Stata 的玩具数据集之一来演示问题:

      sysuse dir
      auto.dta         bplong.dta       brand2.dta       bsexper3.dta     census.dta     
      auto2.dta        bpwide.dta       bsexper1.dta     cancer.dta       citytemp.dta    
      autornd.dta      brand1.dta       bsexper2.dta     cearep.dta       citytemp4.dta
      
      sysuse census, clear
      
      list state region pop marriage in 1 / 5
      
         +---------------------------------------------+
         | state        region          pop   marriage |
         |---------------------------------------------|
      1. | Alabama      South     3,893,888     49,018 |
      2. | Alaska       West        401,851      5,361 |
      3. | Arizona      West      2,718,215     30,223 |
      4. | Arkansas     South     2,286,435     26,513 |
      5. | California   West     23,667,902    210,864 |
         +---------------------------------------------+
      
    2. 或者,您可以使用use 命令直接下载online example dataset

      clear
      use http://fmwww.bc.edu/ec-p/data/wooldridge/vote1
      
      list district voteA expendA shareA in 1 / 5
      
         +-------------------------------------+
         | district   voteA   expendA   shareA |
         |-------------------------------------|
      1. |        7      68     328.3    97.41 |
      2. |        1      62    626.38    60.88 |
      3. |        2      73     99.61    97.01 |
      4. |        3      69    319.69     92.4 |
      5. |        3      75    159.22    72.61 |
         +-------------------------------------+
      
    3. 对于您当前数据集的示例,请使用dataex 命令:

      dataex mpg price foreign in 1 / 5, elsewhere 
      
      ----------------------- copy starting from the next line -----------------------
         * Example generated by -dataex-. To install: ssc install dataex
      clear
      input int(mpg price) byte foreign
      22 4099 0
      17 4749 0
      22 3799 0
      20 4816 0
      15 7827 0
      end
      label values foreign origin
      label def origin 0 "Domestic", modify
      ------------------ copy up to and including the previous line ------------------
      

      在这种情况下,请求变量mpgpriceforeign 的前五个观察值。请注意选项elsewhere,在dataex 的帮助文件中对此进行了说明。

      复制并粘贴结束行之间的所有内容并使用{} 按钮 Stack Overflow 问题编辑器来格式化 sn-p。

      dataex 命令在以下情况下尤其需要:

      • 我们需要明确显示为文本的变量是真正的字符串变量还是带有值标签的数字变量。
      • 您有日期变量,否则对于可能回答要处理的人来说可能会很尴尬。

    1. 您还可以使用其他几个 Stata 命令和函数来模拟数据:

      /* generate data in wide form */
      
      // discard data in memory
      clear
      
      // set the number of observations in dataset
      set obs 6
      
      // create a simple identifier
      generate id = _n
      
      // set the random-number seed for reproducibility
      set seed 12345
      
      // create a uniformly distributed random variable with values between 0 and 1
      generate var1 = runiform()
      
      // create a normally-distributed random variable with mean 20 and standard deviation 5
      generate var2 = rnormal(20, 5)
      
      // create random indicator variable 0/1
      generate var3 = rbinomial(1, 0.5)
      
      // see the results
      list, separator(0)
      
         +---------------------------------+
         | id       var1       var2   var3 |
         |---------------------------------|
      1. |  1   .3576297   22.72038      0 |
      2. |  2   .4004426   20.00814      1 |
      3. |  3   .6893833    21.7884      1 |
      4. |  4   .5597356   29.39434      0 |
      5. |  5   .5744513   33.77373      0 |
      6. |  6   .2076905   16.93702      1 |
         +---------------------------------+
      

      // optionally create value labels for numeric variables such as id above
      
      label define idlabel 1 "one" 2 "two" 3 "three" 4 "four" 5 "five" 6 "six"
      label values id idlabel
      
      list id, separator(0)
      
         +-------+
         |    id |
         |-------|
      1. |   one |
      2. |   two |
      3. | three |
      4. |  four |
      5. |  five |
      6. |   six |
         +-------+
      

      // create (random) date variables
      clear
      set obs 6
      
      // a daily date numeric variable
      display date("25/11/2018", "DMY")
      21513
      
      generate var1 = 21513 + _n
      
      // a random date variable within a specified interval
      generate var2 = floor( ( mdy(12,31,2018) - mdy(1,1,2017)+1 ) * ///
                             runiform() + mdy(1,1,2017) )
      
      // a half-yearly date numeric variable
      display yh(2018, 1)
      116
      
      generate var3 = 116 + _n
      
      // see the raw results
      list var1 var2 var3, separator(0)
      
         +----------------------+
         |  var1    var2   var3 |
         |----------------------|
      1. | 21514   21004    117 |
      2. | 21515   21351    118 |
      3. | 21516   21529    119 |
      4. | 21517   21532    120 |
      5. | 21518   21104    121 |
      6. | 21519   21523    122 |
         +----------------------+
      

      // see formatted results
      
      format %tdDD/NN/CCYY var1
      format %tdDD/NN/CCYY var2
      format %th var3
      
      list var1 var2 var3, separator(0)
      
         +----------------------------------+
         |       var1         var2     var3 |
         |----------------------------------|
      1. | 26/11/2018   04/07/2017   2018h2 |
      2. | 27/11/2018   16/06/2018   2019h1 |
      3. | 28/11/2018   11/12/2018   2019h2 |
      4. | 29/11/2018   14/12/2018   2020h1 |
      5. | 30/11/2018   12/10/2017   2020h2 |
      6. | 01/12/2018   05/12/2018   2021h1 |
         +----------------------------------+
      

      /* generate data in long form */
      
      clear
      set obs 9
      
      // create an identifier increasing every three observations
      egen id = seq(), block(3)
      
      // create a year variable within each id
      bysort id: generate year = 2015 + _n
      
      // create a normally distributed random variable within each id
      bysort id: generate var = rnormal()
      
      // calculate the sum of var within each id
      bysort id: generate sum_var = sum(var)
      
      // note here the use of the `bysort` prefix, which sorts data and repeats
      // the command for each group of observations
      
      // see the results by id
      list, sepby(id)
      
         +-----------------------------------+
         | id   year         var     sum_var |
         |-----------------------------------|
      1. |  1   2016    .1973079    .1973079 |
      2. |  1   2017    1.610224    1.807532 |
      3. |  1   2018   -.8034225    1.004109 |
         |-----------------------------------|
      4. |  2   2016    1.096012    1.096012 |
      5. |  2   2017   -.4407027    .6553089 |
      6. |  2   2018   -1.011427   -.3561177 |
         |-----------------------------------|
      7. |  3   2016    1.019227    1.019227 |
      8. |  3   2017    1.871976    2.891204 |
      9. |  3   2018    .4235664     3.31477 |
         +-----------------------------------+
      

    • Stata 没有产生我想要的结果

    您应该始终在问题中包含来自 Stata 的输出。这应该直接从 Stata 控制台复制和粘贴。然后选择粘贴的输出并在问题编辑器中单击{}

    例子:

    . sysuse auto
    (1978 Automobile Data)
    
    . regress price mpg i.foreign
    
          Source |       SS           df       MS      Number of obs   =        74
    -------------+----------------------------------   F(2, 71)        =     14.07
           Model |   180261702         2  90130850.8   Prob > F        =    0.0000
        Residual |   454803695        71  6405685.84   R-squared       =    0.2838
    -------------+----------------------------------   Adj R-squared   =    0.2637
           Total |   635065396        73  8699525.97   Root MSE        =    2530.9
    
    ------------------------------------------------------------------------------
           price |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
    -------------+----------------------------------------------------------------
             mpg |  -294.1955   55.69172    -5.28   0.000    -405.2417   -183.1494
                 |
         foreign |
        Foreign  |   1767.292    700.158     2.52   0.014     371.2169    3163.368
           _cons |   11905.42   1158.634    10.28   0.000     9595.164    14215.67
    ------------------------------------------------------------------------------
    

    如果 Stata 以意想不到的结果回复您,很可能是因为它没有正确编程。 Stata 只是按照用户的指示去做。

    也就是说,Stack Overflow 上的用户不是读心者。提供所需输出的示例将大大增加您获得有用响应的机会。

    如果是图表,您可以发布说明结果的图片。 否则,最好使用具有足够数量的预期结果的表格。 这可以使用在线表格创建器(例如Table GeneratorASCII Table Generator)生成,并以适当的代码块格式粘贴到您的问题中。

    例子:

    国家人口平均年龄性别比率GDP
    美国 3999 23 1.01 5000
    阿富汗 544 19 0.97 457
    中国 10000 27 0.96 3400

    +--------------------------+------------+----------+-----------+------+
    |                          | Population | Mean_Age | Sex_Ratio | GDP  |
    | Country                  |            |          |           |      |
    +--------------------------+------------+----------+-----------+------+
    | United States of America | 3999       | 23       | 1.01      | 5000 |
    +--------------------------+------------+----------+-----------+------+
    | Afghanistan              | 544        | 19       | 0.97      | 457  |
    +--------------------------+------------+----------+-----------+------+
    | China                    | 10000      | 27       | 0.96      | 3400 |
    +--------------------------+------------+----------+-----------+------+
    

    高质量问题示例

    以下问题可以作为很好的示例,说明您应该如何构建自己的 Stata 相关编程问题:

    进一步的建议

    您还必须阅读 Stack Overflow 上的以下页面:

    1. Site tour
    2. How to ask
    3. Minimal, Complete, and Verifiable example

    最后,您还可以在Statalist FAQ 上找到有用的信息。

    【讨论】:

    • 优秀。编辑了一些小建议。
    猜你喜欢
    • 2021-09-08
    • 2012-05-21
    • 2011-02-06
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多