我确信这是任何使用 Stata 进行出版物或报告的人都遇到过的问题:
您如何方便地将输出导出到可以由脚本语言或 Excel 解析的内容?
有一些ado
文件可以针对特定命令执行此操作。例如:
findit tabout
findit outreg2
但是导出table
命令的输出呢?还是一个的结果anova
?
我很想听听 Stata 用户如何针对特定命令或一般命令解决此问题。
我确信这是任何使用 Stata 进行出版物或报告的人都遇到过的问题:
您如何方便地将输出导出到可以由脚本语言或 Excel 解析的内容?
有一些ado
文件可以针对特定命令执行此操作。例如:
findit tabout
findit outreg2
但是导出table
命令的输出呢?还是一个的结果anova
?
我很想听听 Stata 用户如何针对特定命令或一般命令解决此问题。
在对此进行了一段时间的试验后,我找到了一个适合我的解决方案。
有多种 ADO 可以处理导出特定函数。我已经使用outreg2
了回归和tabout
汇总统计。
对于更简单的命令,您可以轻松编写自己的程序以将结果自动保存为标准格式的纯文本。以下是我写的一些……请注意,它们都显示结果(保存到日志文件)并将它们导出到文本文件中——如果你只想保存到文本中,你可以去掉' di
s 和qui
,等命令:sum
tab
cap program drop sumout
program define sumout
di ""
di ""
di "Summary of `1'"
di ""
sum `1', d
qui matrix X = (r(mean), r(sd), r(p50), r(min), r(max))
qui matrix colnames X = mean sd median min max
qui mat2txt, matrix(X) saving("`2'") replace
end
cap program drop tab2_chi_out
program define tab2_chi_out
di ""
di ""
di "Tabulation of `1' and `2'"
di ""
tab `1' `2', chi2
qui matrix X = (r(p), r(chi2))
qui matrix colnames X = chi2p chi2
qui mat2txt, matrix(X) saving("`3'") replace
end
cap program drop oneway_out
program define oneway_out
di ""
di ""
di "Oneway anova with dv = `1' and iv = `2'"
di ""
oneway `1' `2'
qui matrix X = (r(F), r(df_r), r(df_m), Ftail(r(df_m), r(df_r), r(F)))
qui matrix colnames X = anova_between_groups_F within_groups_df between_groups_df P
qui mat2txt, matrix(X) saving("`3'") replace
end
cap program drop anova_out
program define anova_out
di ""
di ""
di "Anova command: anova `1'"
di ""
anova `1'
qui matrix X = (e(F), e(df_r), e(df_m), Ftail(e(df_m), e(df_r), e(F)), e(r2_a))
qui matrix colnames X = anova_between_groups_F within_groups_df between_groups_df P RsquaredAdj
qui mat2txt, matrix(X) saving("`2'") replace
end
那么问题是如何将输出转换为 Excel 并对其进行格式化。我发现将文本输出文件从 Stata 导入 Excel 的最佳方法是将它们连接成一个大文本文件,然后使用Import Text File...
Excel 中的功能导入该单个文件。
我通过将此 Ruby 代码放在输出文件夹中,然后从我的 Do 文件运行 int 来连接文件qui shell cd path/to/output/folder/ && ruby table.rb
:
output = ""
Dir.new(".").entries.each do |file|
next if file =~/\A\./ || file == "table.rb" || file == "out.txt"
if file =~ /.*xml/
system "rm #{file}"
next
end
contents = File.open(file, "rb").read
output << "\n\n#{file}\n\n" << contents
end
File.open("out.txt", 'w') {|f| f.write(output)}
一旦我在 Excel 中导入out.txt
到它自己的工作表中,我就会使用一堆 Excel 的内置函数将数据整合到漂亮、漂亮的表格中。
我将vlookup
、offset
、match
、iferror
和隐藏列与单元格编号和文件名结合使用来执行此操作。源 .txt 文件包含在out.txt
该文件内容的正上方,您可以使用这些函数查找文件的内容,然后使用vlookup
和引用特定单元格offset
。
这个 Excel 业务实际上是这个系统中最复杂的部分,如果不向您显示文件,确实没有好的方法来解释它,尽管希望您能得到足够的想法来自己弄清楚。如果没有,请随时通过http://maxmasnick.com与我联系,我可以获得更多信息。
我发现estout 包是最发达的并且有很好的文档。
大多数教程都包含几个包,其中只有一个导出所有内容确实不错,这就是 Max 在上面用他有趣的方法提出的建议。
我个人tabout
用于汇总统计和频率,estout
用于回归输出,并且正在尝试mkcorr
相关矩阵。
已经有一段时间了,但我相信您可以发出日志命令来捕获输出。
log using c:\data\anova_analysis.log, text
[commands]
log close
我使用 estpost——estout 包的一部分——将非估计命令的结果制成表格。然后,您可以存储它们并轻松导出。
这是一个例子:
estpost corr varA varB varC varD, matrix
est store corrs
esttab corrs using corrs.rtf, replace
然后,您可以添加选项以更改格式等。
您可以使用 SSC 上提供的 asdoc。去下载,
ssc install asdoc
asdoc 适用于几乎所有的 Stata 命令。具体来说,它为以下内容生成出版质量表: