2010-02-05 187 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 

然後,您可以添加選項更改格式等