恭喜您为您的 Stata 编程问题寻求帮助!
承认你需要他人的意见是迈向的第一步
解决它并成熟为Stata用户/程序员。写一个好问题不是一件小事,需要经验。后者伴随着实践,而这又需要毅力。
编写高质量可重现的 Stata 问题的秘诀是
成功创建沙盒示例。这应该使用最短的
可能的代码 sn-p 和所需的最少示例数据
复制你的问题。
Stack Overflow 的 Stata 志愿者总是乐于提供帮助,但他们不会随意喂食。您的努力不足会降低您获得答案的可能性,并增加您的 Stata 问题被关闭并最终删除的机会。
改进问题的提示
您可以通过单击上方左侧的星号 ⭐ 将此主题添加到您最喜欢的问题列表中。这样您就可以轻松地再次从您的个人资料的收藏选项卡中访问这些提示。
• 我是 Stata 新手,还不知道它的命令
在发布问题之前,请确保您已阅读入门
与Stata。您可以通过在 Stata 的命令提示符下键入 help gs 来访问这些介绍性手册。
熟悉基本概念是无可替代的
和Stata的语法。这一点尤为重要,因为有效的沟通要求您能够与 Stack Overflow 上其他更有经验的 Stata 用户说相同的语言。
不要忘记这些用户想要回答有趣的编程问题,
而不是充当教授基础知识的导师。 Statalist 或 reddit 等更通用的论坛可能更适合解决与基本命令使用相关的问题。
• 我想在 Stata 中做[某事],我需要代码
Stack Overflow 旨在解决特定编程问题。因此,您必须尽可能清楚地解释您的情况并向我们展示您的尝试。
首先明确说明您的问题并告诉我们您的 Stata 版本和平台(Windows、Mac、Linux)。
然后给出一些上下文。这应该着重于用文字简明扼要地描述
您的数据集和您正在尝试做的事情。
接下来告诉我们您是如何尝试实现目标的。这个阶段包括
附上您使用的代码和生成的输出。您还应该链接到您在线咨询过的任何类似问题。
最后向我们提供示例数据以运行代码并重现您的问题。这些数据不应使用屏幕截图显示!有关此步骤的帮助,请参阅下文。
始终响应 cmets 要求潜在回答者的澄清。
• 我在 R/Python/SAS/SPSS 中有这段代码,在 Stata 中也需要同样的代码
询问如何将其他语言的代码翻译成 Stata 的 ado 或
mata 语言仅当且仅当存在特定问题时才有效
在尝试的Stata代码中解决。因此,上一节和下一节中列出的所有项目在这里也都是相关的。
• 这是我使用的 Stata 代码,但它不起作用
-
检查脚本中的拼写错误both 和 在您问题中提供的代码 sn-p 中。 Stata 解释器是无情的:看似简单的编程任务很快就会变成一种令人沮丧的练习。 Stack Overflow 上的 Stata 志愿者不是来寻找因粗心打字而导致的拼写错误。
例子:
locla mymacro HELLO
genrate var = 5
local mymacro HELLO
generate var = 5
-
最好不要缩写命令,避免全部删掉
空白。这使得代码更难阅读并且更容易出错。其他
没有经验的用户也可能会发现即使是基本命令也难以识别。
例子:
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'
}
-
不要发布整个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
-
请务必查看帮助文件以获取有关代码失败原因的线索。问题通常是由无效的语法引起的。您可以通过在 Stata 的命令提示符中键入 help command/function name 来访问命令和函数的帮助文件。
例子:
list, separate(0)
option separate() not allowed
r(198);
在这里,输入help list 表明这不是合法的语法。实际上,选项的名称是separator(#) 而不是separate(#)。
-
在您在这里提问之前,请尝试自行调试代码。 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 报告的完整错误代码和消息。
- 如果您使用的是您拥有的 community-contributed 命令
从 SSC、Stata Journal 或其他来源下载的,请务必在问题的早期指出这一点。这样一来,可能会回答的人就不会浪费时间在外部网站上寻找它,并且可以更快地发现与此命令相关的问题。
• 这是我的 Stata 数据集的屏幕截图
请勿上传截图!
屏幕截图没有您希望的那么有用,主要是因为它们不允许可能回答的人将数据复制并粘贴到他们自己的 Stata 中并尝试重现问题。
除了本主题的问题部分中概述的edit 和input 命令之外,还有四种其他方法可以为您的Stata 问题提供示例数据。
-
如果您的数据是机密的,您可以使用 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 |
+---------------------------------------------+
-
或者,您可以使用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 |
+-------------------------------------+
-
对于您当前数据集的示例,请使用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 ------------------
在这种情况下,请求变量mpg、price 和foreign 的前五个观察值。请注意选项elsewhere,在dataex 的帮助文件中对此进行了说明。
复制并粘贴结束行之间的所有内容并使用{} 按钮
Stack Overflow 问题编辑器来格式化 sn-p。
dataex 命令在以下情况下尤其需要:
- 我们需要明确显示为文本的变量是真正的字符串变量还是带有值标签的数字变量。
- 您有日期变量,否则对于可能回答要处理的人来说可能会很尴尬。
-
您还可以使用其他几个 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 Generator 或ASCII 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 上的以下页面:
- Site tour
- How to ask
- Minimal, Complete, and Verifiable example
最后,您还可以在Statalist FAQ 上找到有用的信息。