2010-02-05 106 views
4

我确定这是一个使用Stata出版物或报告的人遇到的问题:您如何方便地将输出导出为可通过脚本语言或Excel解析的内容?导出Stata结果

有几个ADO文件可用于此特定命令(请尝试findit taboutfindit outreg2)。但是如何输出table命令的输出呢?或者anova的结果?

我很想听听Stata用户如何针对特定命令或一般情况解决此问题。

回答

7

经过一段时间的实验后,我发现了一个适用于我的解决方案。

有各种ADO处理导出特定功能。我使用了outreg2进行回归分析,使用tabout进行总结统计。

对于更简单的命令,可以很容易地编写自己的程序来自动将结果保存为标准格式的明文。这里有一些我写的...注意,这些都显示结果(保存到日志文件)并将它们导出到文本文件 - 如果你想保存到文本,你可以摆脱diquisumtab等命令:

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的最佳方式是将它们连接成一个大文本文件,然后使用Excel中的Import Text File...功能导入该单个文件。

我放置在输出文件夹这个Ruby代码,然后从我的待办事项运行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)} 

一旦我进口out.txt到其自己的工作表在Excel中,我用了一堆Excel的内置函数将数据整合到漂亮,漂亮的表格中。

我使用vlookup,offset,match,iferror的组合以及带有单元格编号和文件名的隐藏列来执行此操作。源.txt文件包含在out.txt的正上方,该文件的内容可让您使用这些函数查找文件的内容,然后使用vlookupoffset来引用特定单元格。

这个Excel业务实际上是这个系统中最复杂的一部分,没有很好的方式来解释它,但没有显示你的文件,但希望你可以得到足够的想法,为自己弄明白。如果没有,请随时通过http://maxmasnick.com与我联系,我可以为您提供更多信息。

0

这是一段时间,但我相信你可以发出一个日志命令来捕获输出。
log using c:\data\anova_analysis.log, text
[commands]
log close

+0

是的,但随后你如何合理地分析日志文件的输出?我更喜欢以具有更多标准化格式的表单接收输出(例如制表符分隔的文本文件)。 – 2010-02-08 14:47:20

+0

您可以使用用户编写的程序-logout-(来自SSC)解析记录的结果。这适用于各种结果格式(例如-table-,-anova-,-regress-等)。安装后,尝试导出一个-table-命令: *** sysuse auto,清除 注销,保存(mystuff)excel修复替换:表格中继rep78,/// c(n mpg mean mpg sd mpg中位数mpg)stubwidth(25) *** – 2010-08-19 02:06:18

6

我发现estout package是最发达的,有很好的文档。

+0

谢谢,我会检查一下。 – 2010-02-08 14:48:48

3

大多数教程都会引用several packages,它真的很高兴只有一个导出所有内容,这是Max用他有趣的方法所建议的。

我个人使用tabout作总结统计和频率,estout作为回归输出,我试着用mkcorr作为相关矩阵。

1

我使用estpost-- estout软件包的一部分来列出来自非估计命令的结果。然后您可以存储它们并轻松导出。

下面是一个例子:

estpost corr varA varB varC varD, matrix 
est store corrs 
esttab corrs using corrs.rtf, replace 

然后,您可以添加选项更改格式等