p値を使用した段階的回帰には、有意でないp値で変数をドロップします
-
02-10-2019 - |
質問
実行したい 段階的線形回帰 使用 p値 選択基準として、例:最高の最も重要でないp値を持つ各ステップドロップ変数で、すべての値がある程度のしきい値によって重要な定義で停止します アルファ.
私はAICを使用する必要があることを完全に認識しています(例:コマンド ステップ また 義理の)または代わりに他のいくつかの基準ですが、私の上司は統計を把握しておらず、p値の使用を主張します。
必要に応じて、自分のルーチンをプログラムすることができますが、これのすでに実装されているバージョンがあるかどうか疑問に思っています。
解決
上司に次のことを示します。
set.seed(100)
x1 <- runif(100,0,1)
x2 <- as.factor(sample(letters[1:3],100,replace=T))
y <- x1+x1*(x2=="a")+2*(x2=="b")+rnorm(100)
summary(lm(y~x1*x2))
それは与えます:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.1525 0.3066 -0.498 0.61995
x1 1.8693 0.6045 3.092 0.00261 **
x2b 2.5149 0.4334 5.802 8.77e-08 ***
x2c 0.3089 0.4475 0.690 0.49180
x1:x2b -1.1239 0.8022 -1.401 0.16451
x1:x2c -1.0497 0.7873 -1.333 0.18566
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
さて、p値に基づいて、どれを除外しますか? X2は最も重要であり、同時に最も重要ではありません。
編集:明確にするために:コメントに示されているように、このexaxmpleは最高ではありません。 STATAおよびSPSSの手順は、係数のt検定のp値ではなく、変数の1つを除去した後のFテストにも基づいています。
まさにそれを行う関数があります。これは「p値」の選択ですが、係数やANOVAの結果のt検定ではありません。さて、それがあなたに役立つように見える場合は、それを自由に使用してください。
#####################################
# Automated model selection
# Author : Joris Meys
# version : 0.2
# date : 12/01/09
#####################################
#CHANGE LOG
# 0.2 : check for empty scopevar vector
#####################################
# Function has.interaction checks whether x is part of a term in terms
# terms is a vector with names of terms from a model
has.interaction <- function(x,terms){
out <- sapply(terms,function(i){
sum(1-(strsplit(x,":")[[1]] %in% strsplit(i,":")[[1]]))==0
})
return(sum(out)>0)
}
# Function Model.select
# model is the lm object of the full model
# keep is a list of model terms to keep in the model at all times
# sig gives the significance for removal of a variable. Can be 0.1 too (see SPSS)
# verbose=T gives the F-tests, dropped var and resulting model after
model.select <- function(model,keep,sig=0.05,verbose=F){
counter=1
# check input
if(!is(model,"lm")) stop(paste(deparse(substitute(model)),"is not an lm object\n"))
# calculate scope for drop1 function
terms <- attr(model$terms,"term.labels")
if(missing(keep)){ # set scopevars to all terms
scopevars <- terms
} else{ # select the scopevars if keep is used
index <- match(keep,terms)
# check if all is specified correctly
if(sum(is.na(index))>0){
novar <- keep[is.na(index)]
warning(paste(
c(novar,"cannot be found in the model",
"\nThese terms are ignored in the model selection."),
collapse=" "))
index <- as.vector(na.omit(index))
}
scopevars <- terms[-index]
}
# Backward model selection :
while(T){
# extract the test statistics from drop.
test <- drop1(model, scope=scopevars,test="F")
if(verbose){
cat("-------------STEP ",counter,"-------------\n",
"The drop statistics : \n")
print(test)
}
pval <- test[,dim(test)[2]]
names(pval) <- rownames(test)
pval <- sort(pval,decreasing=T)
if(sum(is.na(pval))>0) stop(paste("Model",
deparse(substitute(model)),"is invalid. Check if all coefficients are estimated."))
# check if all significant
if(pval[1]<sig) break # stops the loop if all remaining vars are sign.
# select var to drop
i=1
while(T){
dropvar <- names(pval)[i]
check.terms <- terms[-match(dropvar,terms)]
x <- has.interaction(dropvar,check.terms)
if(x){i=i+1;next} else {break}
} # end while(T) drop var
if(pval[i]<sig) break # stops the loop if var to remove is significant
if(verbose){
cat("\n--------\nTerm dropped in step",counter,":",dropvar,"\n--------\n\n")
}
#update terms, scopevars and model
scopevars <- scopevars[-match(dropvar,scopevars)]
terms <- terms[-match(dropvar,terms)]
formul <- as.formula(paste(".~.-",dropvar))
model <- update(model,formul)
if(length(scopevars)==0) {
warning("All variables are thrown out of the model.\n",
"No model could be specified.")
return()
}
counter=counter+1
} # end while(T) main loop
return(model)
}
他のヒント
使用してみませんか step()
テスト方法を指定する関数?
たとえば、後方排除の場合、コマンドのみを入力します。
step(FullModel, direction = "backward", test = "F")
そして、段階的な選択のために、単純に:
step(FullModel, direction = "both", test = "F")
これにより、AIC値とF値とP値の両方を表示できます。
これが例です。最も複雑なモデルから始めます。これには、3つの説明変数間の相互作用が含まれます。
model1 <-lm (ozone~temp*wind*rad)
summary(model1)
Coefficients:
Estimate Std.Error t value Pr(>t)
(Intercept) 5.683e+02 2.073e+02 2.741 0.00725 **
temp -1.076e+01 4.303e+00 -2.501 0.01401 *
wind -3.237e+01 1.173e+01 -2.760 0.00687 **
rad -3.117e-01 5.585e-01 -0.558 0.57799
temp:wind 2.377e-01 1.367e-01 1.739 0.08519
temp:rad 8.402e-03 7.512e-03 1.119 0.26602
wind:rad 2.054e-02 4.892e-02 0.420 0.47552
temp:wind:rad -4.324e-04 6.595e-04 -0.656 0.51358
3方向の相互作用は明らかに重要ではありません。これは、モデルの単純化のプロセスを開始するために、それを削除する方法です。
model2 <- update(model1,~. - temp:wind:rad)
summary(model2)
結果によっては、モデルの簡素化を続けることができます。
model3 <- update(model2,~. - temp:rad)
summary(model3)
...
または、自動モデルの簡素化機能を使用することもできます step
, 、それがどれだけうまくいくかを見るために
model_step <- step(model1)
最良の予測モデルを取得しようとしている場合、おそらくそれはあまり重要ではありませんが、他のことでは、この種のモデル選択を気にしないでください。間違っています。
尾根回帰などの収縮方法を使用します(で lm.ridge()
たとえば、パッケージの質量)、またはラッソ、または弾性ネット(尾根とラッソの制約の組み合わせ)。これらのうち、ラッソと弾性ネットのみが何らかの形のモデル選択を行います。つまり、いくつかの共変量の係数をゼロにします。
の正則化と収縮セクションを参照してください 機械学習 クランのタスクビュー。
パッケージ RMS:回帰モデリング戦略 もっている fastbw()
それはまさにあなたが必要とすることをします。 AICからp値ベースの除去に反転するパラメーターもあります。
Gavin Simpsonが述べたように、この機能 fastbw
から rms
パッケージを使用して、p値を使用して変数を選択できます。 Bellowは、George Dontasによって与えられた例を使用した例です。オプションを使用します rule='p'
p値基準を選択します。
require(rms)
model1 <- ols(Ozone ~ Temp * Wind * Solar.R, data=airquality)
model2 <- fastbw(fit=model1, rule="p", sls=0.05)
model2