一、緣起
1,問(wèn)題
經(jīng)常碰到一些經(jīng)典的案例講解變量的邏輯關(guān)系,沒(méi)有原數(shù)據(jù)只有匯總后的集合數(shù)據(jù),或者原數(shù)據(jù)就是集合數(shù)據(jù),例如R自帶的Titanic數(shù)據(jù)集。這對(duì)于習(xí)慣于處理個(gè)體數(shù)據(jù)集的人來(lái)說(shuō),模擬訓(xùn)練有點(diǎn)麻煩。
例如,辛普森悖論中的經(jīng)典例子。
| 學(xué)院 | 女生 | 女生 | 女生 | 男生 | 男生 | 男生 | 合計(jì) | 合計(jì) | 合計(jì) |
|---|---|---|---|---|---|---|---|---|---|
| 申請(qǐng) | 錄取 | 錄取率 | 申請(qǐng) | 錄取 | 錄取率 | 申請(qǐng) | 錄取 | 錄取率 | |
| 商學(xué)院 | 100 | 49 | 49% | 20 | 15 | 75% | 120 | 64 | 53.30% |
| 法學(xué)院 | 20 | 1 | 5% | 100 | 10 | 10% | 120 | 11 | 9.20% |
| 總計(jì) | 120 | 50 | 42% | 120 | 25 | 21% | 240 | 75 | 31.30% |
雖然可以手工進(jìn)行表格的重組,但是我希望能把它轉(zhuǎn)成個(gè)體數(shù)據(jù)集,從而可以進(jìn)行多種統(tǒng)計(jì)方法的模擬訓(xùn)練。
2,嘗試
- 函數(shù)
runiform()系列,能生成隨機(jī)數(shù)。我不知道如何利用它按比例隨機(jī)抽取樣本。 - 命令
sample,能隨機(jī)抽取樣本,但是它會(huì)把其他樣本刪除。 - 命令
reshape,長(zhǎng)寬表轉(zhuǎn)換,卻沒(méi)法把集合數(shù)據(jù)展開(kāi)成個(gè)體數(shù)據(jù)。
二、splitsample命令
在從網(wǎng)上搜索不到解決辦法之后,我開(kāi)始重回檢索STATA的操作手冊(cè)。
- 首先我相信STATA應(yīng)該有相關(guān)的命令。
- 我判斷我要找的命令應(yīng)該和命令
sample、reshape同屬一類(lèi),在同一本操作分冊(cè)中。 - 瀏覽【D】?jī)?cè)(Data Management)的命令目錄,查看可能的命令。
哈哈,還真讓我找到了解決我的問(wèn)題的命令splitsample。
語(yǔ)法
splitsample — Split data into random samples
splitsample [varlist] [if] [in], generate(newvar [, replace]) [options]
常見(jiàn)用法
- 基礎(chǔ)命令。數(shù)據(jù)隨機(jī)分成兩半,生成新的樣本ID變量,其值默認(rèn)賦為1和2。
splitsample, gen(svar)
- 如上,但用選項(xiàng)
values()改變賦值。
splitsample, gen(svar) values(0 1)
- 數(shù)據(jù)隨機(jī)3等分,其值默認(rèn)為1,2和3。選項(xiàng)
nsplit(#)設(shè)置幾等分。
splitsample, gen(svar) nsplit(3)
- 按比例(proportions)隨機(jī)切分?jǐn)?shù)據(jù)。選項(xiàng)
split()設(shè)置各組比例。
# 第1組樣本占25%,第二組占25%,第三組占50%
splitsample, gen(svar) split(0.25 0.25 0.5)
- 按比(ratios)隨機(jī)切分?jǐn)?shù)據(jù)。同樣使用選項(xiàng)
split()。
#按1:1:2的比值切分?jǐn)?shù)據(jù)
splitsample, gen(svar) split(1 1 2)
- 在指定變量各組中保持切分的比例或比值一致,使用選項(xiàng)
balance()。
#各年齡組和性別組的切分比值一致。
splitsample, gen(svar) split(1 1 2) balance(agegrp gender)
三、實(shí)例
# 設(shè)定樣本量
set obs 240
set seed 1234
# 第一步,從性別開(kāi)始賦值。這一步最好做。男女各120人。
gen sex=1
replace sex=0 in 1/120
label def sex 0 "女" 1 "男" # 定義性別標(biāo)簽
label values sex sex #給性別變量sex賦標(biāo)簽
#也可以直接使用splitsample命令
splitsample, gen(gender) values(0,1)
# 男生報(bào)考法學(xué)院和商學(xué)院的比值為5:1
splitsample if sex==1, gen(school) split (5 1) values (0, 1)
# 女生報(bào)考法學(xué)院和商學(xué)院的比值為1:5
splitsample if sex==0, gen(school1) split (1 5) values (0, 1)
# 將分別生成的學(xué)院變量合并
replace school=school1 if school==.
label def school 0 "法學(xué)院" 1 "商學(xué)院" #定義學(xué)院標(biāo)簽
label values school school # 給學(xué)院變量school賦標(biāo)簽
tab school sex
# 由于兩性報(bào)考學(xué)院的比值正好顛倒,所以也可以用另一種處理辦法
splitsample, gen(college) split (1 5) values (0, 1) balance(sex)
recode college (0=1) (1=0) if sex==1
# 根據(jù)錄取率生成錄取變量。
# 錄取率由于有四種情況,所以根據(jù)四種情況分別生成對(duì)應(yīng)的錄取變量
splitsample if sex==0 & school==0, gen(pass) split(0.95 0.5) values(0, 1)
splitsample if sex==0 & school==1, gen(pass1) split(0.51 0.49) values(0,1)
splitsample if sex==1 & school==0, gen(pass2) split(0.25 0.75) values(0,1)
splitsample if sex==1 & school==1, gen(pass3) split(0.9 0.1) values(0,1)
# 然后再合并成一個(gè)錄取變量pass
replace pass=pass1 if sex==0 & school==1
replace pass=pass2 if sex==1 & school==1
replace pass=pass3 if sex==1 & school==0
# 根據(jù)個(gè)體數(shù)據(jù)集,重構(gòu)列聯(lián)表
table (pass) (school sex)
table () (school sex), stat(fvpercent pass)
#logit回歸
logit pass sex
logit pass school
logit school sex
logit pass school sex