我想使用p值作为选择标准来执行逐步线性回归,例如:在每个步骤中丢弃具有最高即最不重要的p值的变量,当所有值由某个阈值α显着定义时停止.
我完全知道我应该使用AIC(例如命令步骤或stepAIC)或其他一些标准,但我的老板不掌握统计数据并且坚持使用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是最重要的,同时也是最重要的.
编辑:澄清:如评论中所示,这个例子并不是最好的.Stata和SPSS中的程序也是AFAIK,也不是基于系数T检验的p值,而是基于去除其中一个变量后的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]
2> 小智..:为什么不尝试使用
step()
指定测试方法的函数?例如,对于反向消除,只键入一个命令:
step(FullModel, direction = "backward", test = "F")对于逐步选择,只需:
step(FullModel, direction = "both", test = "F")这可以显示AIC值以及F和P值.
3> George Donta..:这是一个例子.从最复杂的模型开始:这包括所有三个解释变量之间的相互作用.
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三方互动显然不重要.这是你删除它的方法,开始简化模型的过程:
model2 <- update(model1,~. - temp:wind:rad) summary(model2)根据结果,您可以继续简化模型:
model3 <- update(model2,~. - temp:rad) summary(model3) ...或者,您可以使用自动模型简化功能
step
,以查看它的功能:model_step <- step(model1)
4> 小智..:包装RMS:回归建模策略有
fastbw()
已经做了你所需要的东西.甚至还有一个参数可以从AIC转换为基于p值的消除.
5> Reinstate Mo..:如果你只是想要获得最好的预测模型,那么也许它并不重要,但对于其他任何事情,不要为这种模型选择而烦恼.这是错误的.
使用收缩方法,例如岭回归(
lm.ridge()
例如,在MASS包中),或套索,或弹性网(脊和套索约束的组合).其中,只有套索和弹性网将进行某种形式的模型选择,即将一些协变量的系数强制为零.请参阅CRAN 上" 机器学习"任务视图的"正则化和收缩"部分.