2015-04-28 89 views
0

(Stata/MP 13.1)在不讀取整個數據集(Stata 13.1)的情況下載入數據集的前幾個觀察值?

我正在處理一組需要非常長時間才能加載的海量數據集。我目前正在循環所有數據集以每次加載它們。

是否有可能只是告訴Stata加載每個數據集的前5個觀測值(或者一般情況下每個使用命令中的第一個數據集)?而實際上並不需要加載整個數據集?否則,如果我要加載整個數據集,然後只保留前5個觀察值,則該過程需要非常長的時間。

這裏有兩種解決方法我已經嘗試

  1. use in 1/5 using mydata:我覺得這不僅僅是加載數據,然後讓你在一個不同的線路要觀察更有效,但我認爲它仍然讀入整個數據集。
  2. 首先加載所有的數據集,然後保存所有數據集的副本作爲前5個觀察值,然後使用副本:這很麻煩,因爲我有很多不同的文件;我非常希望只用一種直接的方式來讀取前5個觀察值,而不必訴諸於此方法,也不必讀取整個數據集。

回答

3

我會說使用in是在Stata做到這一點自然的方式,但測試顯示 你是正確的:它真的是沒有「大」的區別,考慮到數據集的大小。一個例子是(有148,000,000意見)

sysuse auto, clear 
expand 2000000 

tempfile bigfile 
save "`bigfile'", replace 

clear 
timer on 1 
use "`bigfile'" 
timer off 1 

clear 
timer on 2 
use "`bigfile'" in 1/5 
timer off 2 

timer list 
timer clear 

從而造成

. timer list 
    1:  6.44/  1 =  6.4400 
    2:  4.85/  1 =  4.8480 

我覺得奇怪,因爲in似乎在其他情況下真的efficicient。 我會聯繫Stata技術支持(和/或周圍的搜索,包括www.statalist.com),只問問爲什麼in不是更快 (獨立於您尋找其他策略來解決這個問題)。

當然值得使用;但對於許多應用來說速度不夠快。

在工作流程方面,您的第二個選項可能是最好的。在創建較小的數據集時讓計算機保持運行(對於循環,使用),並在完成後返回到常規編碼/調試。這真的取決於你在做什麼,所以它可能工作與否。

1

其實我找到了解決辦法。如果您運行

use mybigdata if runiform() <= 0.0001 

Stata將隨機採樣0.0001的數據集而不讀取整個數據集。

謝謝!

文森特

編輯:2015年4月28日(下午1:58 EST) 我道歉。原來上面實際上是而不是原始問題的解決方案。看來在我的系統上使用的速度有很大的變化。每次我運行它時,使用的速度都不一樣。當我發佈上述解決方案時,我認爲當我運行代碼時,它恰好是一個更快的實例。然而,正如我現在重複運行

use mybigdata if runiform() <= 0.0001 

use in 1/5 using mydata 

其實我發現

use in 1/5 using mydata 

平均爲快。

一般來說,我的問題是如何讀取Stata數據集的一部分,而不必爲了計算目的而讀取整個數據集,特別是當數據集非常大時。

編輯:2015/4/28(2:50 PM EST) 總的來說,我有20個數據集,每個數據集有5到1500萬個觀察值。我只需要保留8個變量(每個數據集中有58-65個變量)。以下是前四個「描述性短」陳述的輸出。

2004 action1 

Contains data from 2004action1.dta 
    obs: 15,039,576       
vars:   64       30 Oct 2014 17:09 
size: 2,827,440,288       
Sorted by: 

2004 action2578 

Contains data from 2004action2578.dta 
    obs: 13,449,087       
vars:   59       30 Oct 2014 17:16 
size: 2,098,057,572       
Sorted by: 

2005 action1 

Contains data from 2005action1.dta 
    obs: 15,638,296       
vars:   65       30 Oct 2014 16:47 
size: 3,143,297,496       
Sorted by: 

2005 action2578 

Contains data from 2005action2578.dta 
    obs: 14,951,428       
vars:   59       30 Oct 2014 17:03 
size: 2,362,325,624       
Sorted by: 

謝謝!

文森特

+1

這是你已經找到了一個解決方案是一件好事,但坦率地說,我不明白爲什麼工程。我相信你的代碼行爲每個觀察計算一個隨機數,然後將它與'0.0001'進行比較,並相應地包含觀察結果。所以這涉及檢查每個觀察,即整個數據集。事實上,在我的機器上進行的測試表明,這需要花費兩倍的時間。第二點是你的原始問題沒有提到你想要一個隨機樣本;你可能想編輯它。第三點是你得到的觀察數量是可變的。第四點,用'set seed'重新編程。 –

+0

嗨羅伯託。謝謝你的幫助。事實上,我剛剛編輯了我的回答,以迴應您的帖子,並且我意識到我實際上並未找到解決方案。詳情請參閱我的編輯;不過,我絕對感謝你的提示和建議! – Vincent

+1

沒問題。只是好奇:您的原始數據集有多少觀察值和變量?你應該在原文中提供'describe,short'的輸出。你需要保留所有變量嗎?你使用了多少個文件? –

相關問題