2014-02-22 95 views
2

我的數據集包括兩個主要變量XY在Stata中使用虛擬變量和foreach生成變量的手段

  • 變量X代表具有不同品牌的多個計算機項目的不同代碼(例如001X01,001X02等)。
  • 變量Y表示在商店中爲變量X(例如,對於001X01,15 = 15%)的每個代碼徵收的稅。

我已經創建了使用虛擬變量這些計算機項類別(例如HD虛擬變量爲硬盤驅動器,取1值時可變X表示HD等)。我有一個超過40個變量的列表(其中兩個代表XY,其餘的是我爲計算機項目創建的不同類別的一組虛擬變量)。

我想在Stata中使用循環顯示所有這些類別的平均值,但我不確定如何執行此操作。

例如代碼:

mean Y if HD == 1 


Mean estimation      Number of obs =  5 

-------------------------------------------------------------- 
      |  Mean Std. Err.  [95% Conf. Interval] 
-------------+------------------------------------------------ 
    Tax  |  7.1 2.537716  1.154172 15.24583 

讓我對代表硬盤類別的平均稅。我如何在Stata中使用循環來自動顯示爲每個類別收取的所有平均稅收?我會手工做到這一點,但沒有問題,但我想重複這個過程多年,所以我想每年使用一個循環來獲得這個輸出。

我的目標是創建一個單獨的Excel文件,其中包含我創建的每個計算機類別(總計38個)以及每個類別的平均稅額。

回答

2

爲什麼要打擾循環並創建指示變量?如果我理解正確的話,你的初始數據集允許使用一個簡單的collapse

clear all 
set more off 

input /// 
code tax str10 categ 
1 0.15 "hd" 
2 0.25 "pend" 
3 0.23 "mouse" 
4 0.29 "pend" 
5 0.16 "pend" 
6 0.50 "hd" 
7 0.54 "monitor" 
8 0.22 "monitor" 
9 0.21 "mouse" 
10 0.76 "mouse" 
end 

list 

collapse (mean) tax, by(categ) 

list 

要拍攝到Excel,你可以嘗試export excelput excel

運行help collapsehelp export瞭解詳情。


編輯

因爲你堅持,下面是給使用循環相同的結果的一個例子。 我假設和以前一樣的數據input。使用此示例數據庫和expand 1000000進行的一些測試顯示速度幾乎相同。但幾乎肯定, 你(包括你的未來你)和你的讀者會更喜歡collapse。 它更清晰,更簡潔。它更漂亮。

levelsof categ, local(parts) 
gen mtax = . 

quietly { 
    foreach part of local parts { 
     summarize tax if categ == "`part'", meanonly 
     replace mtax = r(mean) if categ == "`part'" 
    } 
} 

bysort categ: keep if _n == 1 
keep categ mtax 

Stata的功能與其他語言完全不同。一旦 開始掌握它,您會發現在其他地方循環完成的很多事情, 可以在Stata中循環更少。在許多情況下,後者的風格將是首選。

請參見相應的使用help <command>幫助文件,如果你不與保存結果(例如r(mean)),類型help return熟悉。

+0

非常感謝您的回覆。我的數據並沒有真正的CATEG變量,只有CODE&TAX,代碼描述了一個項目(例如HD),但每個代碼都是唯一的,即使它們屬於同一類別(所以我有50個不同的代碼 - 所有代碼適用於硬盤驅動器)。我創建了一個虛擬變量來「分類」這些項目。另外,我不會使用所有的代碼,其中一些數據包括我不感興趣的計算機部分。 – user3339434

+0

Collapse絕對做我正在尋找的東西,我只需做一些小的修改(例如根據虛擬變量創建一個類別變量)。感謝Roberto Ferrer.I仍然樂於學習如何在這種情況下使用循環,任何幫助將不勝感激。 – user3339434

+0

當你的分類變量'X'中已經有相同的信息(爲什麼你認爲你需要創建一個不明確)時,在這裏創建指標(你說虛擬變量)沒有什麼好處。正如@Roberto Ferrer指出的那樣,這裏不需要循環,但可用的循環技術顯着記錄在例如http://www.stata.com/support/faqs/data-management/try-all-values-with-foreach/index.html –

1

羅伯託的優秀答案補充:collapse之後,你需要一個循環導出結果到Excel。

levelsof categ, local(levels) 
foreach x of local levels { 
export excel `x', replace 
} 

我更喜歡使用數值代碼來表示變量,例如您的類別變量。然後我給他們分配價值標籤。這裏是羅伯託的代碼版本,這是否和,更緊密的對應到你的問題,增加了一個「年」變量

input code tax categ year 
1 0.15 1 1999 
2 0.25 2 2000 
3 0.23 3 2013 
4 0.29 1 2010 
5 0.16 2 2000 
6 0.50 1 2011 
7 0.54 4 2000 
8 0.22 4 2003 
9 0.21 3 2004 
10 0.76 3 2005 
end 

#delim ; 
label define catl 
1 hd 
2 pend 
3 mouse 
4 monitor 
; 
#delim cr 
label values categ catl 
collapse (mean) tax, by(categ year) 

levelsof categ, local(levels) 
foreach x of local levels { 
export excel `:label (categ) `x'', replace 
} 

#delim ;命令能夠很容易地列出在單獨一行上每個代碼。 export語句中的「標籤」函數是一個擴展的宏函數,用於將值標籤插入到文件名中。