2013-07-10 575 views
3

我想引導Stata中的逐步迴歸並提取引導係數。我有兩個單獨的ado文件。 sw_pbs是用戶使用的命令,它調用helper命令sw_pbs_simulator。在Stata中引導逐步迴歸

program define sw_pbs, rclass 
    syntax varlist, [reps(integer 100)] 
    simulate _b, reps(`reps') : sw_pbs_simulator `varlist' 
end 


program define sw_pbs_simulator, rclass 
    syntax varlist 

    local depvar : word 1 of `varlist' 
    local indepvar : list varlist - depvar 
    reg `depvar' `indepvar' 
    local rmse = e(rmse) 
    matrix b_matrix = e(b)' 
    gen col_of_ones = 1 
    mkmat `indepvar' col_of_ones, mat(x_matrix) 
    gen errs = rnormal(0, `rmse') 
    mkmat errs, mat(e_matrix) 
    matrix y = x_matrix * b_matrix + e_matrix 
    svmat y 
    sw reg y `indepvar', pr(0.10) pe(0.05) 
    drop col_of_ones errs y 

end 

輸出是自舉係數的數據集。我的問題是輸出似乎取決於第一次逐步迴歸模擬的結果。例如,如果我有獨立變量var1 var2 var3 var4,並且第一個逐步模擬僅包含模型中的var1和var2,則只有var1和var2將出現在後續模型中。如果第一次模擬包含var1 var2和var3,則只有var1 var2和var3將出現在後續模型中,假設它們很重要(如果不是它們的係數將顯示爲點)。

例如,不正確的輸出顯示在下面。如果它們不出現在第一次模擬中,那麼變量lweight,age,lbph,svi,gleason和pgg45就不會出現。

_b_lweight _b_age _b_lbph _b_svi _b_lcp _b_gleason _b_pgg45 _b_lpsa 
         .4064831      .5390302 
         .2298697      .5591789 
         .2829061      .6279869 
         .5384691      .6027049 
         .3157105      .5523808 

我想不包含在模型中始終顯示爲數據集中點的係數,我想以後的模擬,以不看似依賴於第一仿真。

+1

可以說,代替缺失值,你應該考慮設置從逐步迴歸中退出的係數爲零。其他模型選擇方法(如套索)明確地執行此操作。零是迴歸係數的一個有效值,它給出了與由'sw'維持的係數相同的擬合值,這是從統計角度來看的一個有趣和有缺陷的方法。但是,這是關於簡歷討論的一點,而不是如此:)。 – StasK

回答

3

通過使用_b作爲捷徑,第一次迭代定義了在所有後續迭代中存儲simulate的係數。對於大多數仿真程序來說,這很好,因爲那些系統會使用一組固定的係數,但不能與sw結合使用。所以我調整了程序,明確列出要存儲的係數(可能在未選擇時丟失)。

我也改變了你的程序,以避免mkmatsvmat,並用predictgenerate代替那些計算,它們運行得更快。我也對它進行了修改,使其更符合Stata社區中的慣例,即在用戶通過指定clear選項明確要求之後,命令將僅替換內存中的數據集。最後,我確保通過使用tempvartempname,程序中創建的變量和標量的名稱不會與已經存在於存儲器中的名稱相沖突。這些也將在程序結束時自動刪除。

clear all 
program define sw_pbs, rclass 
    syntax varlist, clear [reps(integer 100)] 

    gettoken depvar indepvar : varlist 
    foreach var of local indepvar { 
     local res "`res' `var'=r(`var')" 
    } 

    simulate `res', reps(`reps') : sw_pbs_simulator `varlist' 
end 

program define sw_pbs_simulator, rclass 
    syntax varlist 
    tempname rmse b 
    tempvar yhat y 
    gettoken depvar indepvar : varlist 
    reg `depvar' `indepvar' 
    scalar `rmse' = e(rmse) 
    predict double `yhat' if e(sample) 
    gen double `y' = `yhat' + rnormal(0, `rmse') 
    sw reg `y' `indepvar', pr(0.10) pe(0.05) 

    // start returning coefficients 
    matrix `b' = e(b) 
    local in : colnames `b' 
    local out : list indepvar - in 
    foreach var of local in { 
     return scalar `var' = _b[`var'] 
    } 
    foreach var of local out { 
     return scalar `var' = . 
    } 
end 
+0

我認爲該程序仍然存在這樣的問題:在第一次模擬中沒有通過逐步迴歸選擇的變量在之後的任何模擬中從未被選擇。我在主要問題中增加了一個這個問題的例子。 – davidkohn

+0

我想我現在明白了這個問題,並且我已經編輯了相應的答案。 –