ブートストラップ回帰から係数のp値を取得するにはどうすればよいですか?


10

Robert KabacoffのQuick-Rから

# Bootstrap 95% CI for regression coefficients 
library(boot)
# function to obtain regression weights 
bs <- function(formula, data, indices) {
  d <- data[indices,] # allows boot to select sample 
  fit <- lm(formula, data=d)
  return(coef(fit)) 
} 
# bootstrapping with 1000 replications 
results <- boot(data=mtcars, statistic=bs, 
     R=1000, formula=mpg~wt+disp)

# view results
results
plot(results, index=1) # intercept 
plot(results, index=2) # wt 
plot(results, index=3) # disp 

# get 95% confidence intervals 
boot.ci(results, type="bca", index=1) # intercept 
boot.ci(results, type="bca", index=2) # wt 
boot.ci(results, type="bca", index=3) # disp

ブートストラップ回帰係数のp値を取得するにはどうすればよいですか?H0:bj=0


「p値」とはどういう意味ですか?どの帰無仮説を使用する特定のテスト?
ブライアンディッグス

修正H0:bj = 0
ECII、2014年

3
信頼区間に0が含まれていないかどうかに基づいて、すでに /を取得しています。ブートストラップからのパラメーターの分布はパラメトリックではないため、これ以上の詳細は不可能です(したがって、確率を取得できません)値は0です)。p<0.05p>0.05
Brian Diggs、2014年

分布を想定できない場合、CIに0が含まれていない場合にp <0.05であることをどのようにして知ることができますか?これはzまたはtの分布にも当てはまります。
ECII、2014年

わかりましたが、p <0.05としか言えないので、特定の値を付けることはできませんか?
ECII、2014年

回答:


8

やや単純化した別のバリアントですが、ライブラリbootを明示的に使用せずにメッセージを配信すると、一部の人々が使用する構文で混乱する可能性があります。

線形モデルがあります:、y=Xβ+ϵϵN(0,σ2)

以下は、その線形モデルのパラメトリックブートストラップです。つまり、元のデータをリサンプリングせずに、実際に近似モデルから新しいデータを生成します。さらに、回帰係数のブートストラップされた分布は対称であり、それは並進不変であると仮定します。(非常に大まかに言えば、その特性に影響を与えてその軸を移動できる)背後にある考え方は、の変動はによるものであり、したがって、十分なサンプルがあれば、真の分布の適切な近似を提供するはずですさん。前と同じように、もう一度をテストし、p値を次のように定義しましたββϵβH0:0=βj「データの確率分布についての帰無仮説が与えられた場合、結果は観測された結果と同じか極端になる確率」(この場合の観測された結果は、取得した元のモデルの場合)。だからここに行く:β

# Sample Size
N           <- 2^12;
# Linear Model to Boostrap          
Model2Boot  <- lm( mpg ~ wt + disp, mtcars)
# Values of the model coefficients
Betas       <- coefficients(Model2Boot)
# Number of coefficents to test against
M           <- length(Betas)
# Matrix of M columns to hold Bootstraping results
BtStrpRes   <- matrix( rep(0,M*N), ncol=M)

for (i in 1:N) {
# Simulate data N times from the model we assume be true
# and save the resulting coefficient in the i-th row of BtStrpRes
BtStrpRes[i,] <-coefficients(lm(unlist(simulate(Model2Boot)) ~wt + disp, mtcars))
}

#Get the p-values for coefficient
P_val1 <-mean( abs(BtStrpRes[,1] - mean(BtStrpRes[,1]) )> abs( Betas[1]))
P_val2 <-mean( abs(BtStrpRes[,2] - mean(BtStrpRes[,2]) )> abs( Betas[2]))
P_val3 <-mean( abs(BtStrpRes[,3] - mean(BtStrpRes[,3]) )> abs( Betas[3]))

#and some parametric bootstrap confidence intervals (2.5%, 97.5%) 
ConfInt1 <- quantile(BtStrpRes[,1], c(.025, 0.975))
ConfInt2 <- quantile(BtStrpRes[,2], c(.025, 0.975))
ConfInt3 <- quantile(BtStrpRes[,3], c(.025, 0.975))

すでに述べたように、全体的な考えは、あなたがのブートストラップされた分布を彼らの本当の分布に近似させるということです。(明らかに、このコードは速度を優先して最適化されていますが、読みやすさを重視しています。:))β


16

コミュニティと@BrianDiggsは私が間違っている場合は私を修正するかもしれませんが、あなたはあなたの問題のp値を次のように得ることができると信じています。両側検定のp値は次のように定義されます

2min[P(Xx|H0),P(Xx|H0)]

したがって、ブートストラップされた係数をサイズで並べ替えてから、比率のゼロを大きくしたり小さくしたりする場合、最小比率の2倍にp値を与える必要があります。

私は通常、このような状況で次の関数を使用します。

twosidep<-function(data){
  p1<-sum(data>0)/length(data)
  p2<-sum(data<0)/length(data)
  p<-min(p1,p2)*2
  return(p)
}

4

ブートストラップを使用して値を計算できますが、コードを大幅に変更する必要があります。私はRIに詳しくないので、必要なことを調べることができるリファレンスしか提供できません:(Davison and Hinkley 1997)の第4章。p

Davison、ACおよびHinkley、DV1997。ブートストラップメソッドとそのアプリケーション。ケンブリッジ:Cambridge University Press。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.