2016-08-30 52 views
1

我試圖獲得迴歸係數的引導SE。在使用數據的模樣:在`boot`包中自定義分層樣本策略

set.seed(1234) 
df <- data.frame(y = rnorm(1:30), 
      fac1 = as.factor(sample(c("A","B","C","D","E"),30, replace = T)), 
      fac2 = as.factor(sample(c("NY","NC","CA"),30,replace = T)), 
      x = rnorm(1:30)) 

我使用boot包進行引導:

library(boot) 
fun <- function(data, index){ 
    data <- df[index,] 
    reg <- lm(y ~ fac1 + fac2 + x, data) 
    coef(reg) 
} 
test.boot <- boot(df, fun, strata = df$fac1, 100) 

然而,R抱怨:

Error in boot(df, fun, strata = df$fac1, 100) : 
number of items to replace is not a multiple of replacement length 

我的情況是完全一樣提到here。我理解這裏的問題是每個小組的觀察不足。 boot包中的strata選項似乎只能用於一個因子變量。就我而言,我應該根據兩個因素對樣本進行分層:fac1fac2(如果我的理解不正確,請讓我知道)。

我發現函數stratified發佈here可以根據我的需要產生精確的分層樣本。這裏的問題是如何將stratified函數實現爲boot函數,並讓boot函數對正確的採樣有效?

目前,我自己編寫了一個for-loop以使用正確的分層樣本運行自引導。但我仍然想知道我是否可以將stratified函數納入boot?有什麼建議麼?謝謝!

+0

請參閱'help(「interaction」)'從2個因子構建單一因子。 – lmo

+0

謝謝@lmao。我認爲使用「互動」絕對是解決上述問題的好方法。我仍然很好奇,如果我可以將其他自定義函數(比如這裏提到的'stratified')併入'boot',因爲我可能需要'stratified'提供的額外功能來處理更復雜的情況。謝謝! – Chuan

回答

1

仔細分析了boot包後,我想我找到了解決方案,而不修改boot的原始代碼。實際上,boot提供了一種讓用戶定製他的採樣策略的方法。檢查help(boot)中的sim = "parametric"ran.gen選項。

因此,就我而言,我可以簡單地指定ran.gen函數來嵌套stratified函數並使用它來重新生成自舉採樣。

fun <- function(data){ 
      reg <- lm(y ~ fac1 + fac2 + x, data) 
      coef(reg)} 

rgen <- function(df,stratified){ 
     #code of stratified goes here and other specifications ... } 

test.boot <- boot(df, fun, 1000, sim = "parametric", ran.gen = rgen) 

完成!