为什么在重新排列数据框中的变量后,regsubsets(R,leaps package)中的向后选择会产生无意义的结果?

时间:2015-04-12 21:26:29

标签: r linear-regression feature-selection

我正在尝试使用MASS包中的波士顿数据以及R中的leaps包中的regsubsets()函数进行前向和后向选择,并比较每种大小所选的模型。我观察到,在重新排列数据列并重新运行算法后,我会在向后选择中获得不同的结果,包括每个大小的模型中包含哪些变量。

首先,这很好用:

library(leaps)
library(MASS)
# Boston data: split into training and test
set.seed(12345)
test_inds <- sample(1:nrow(Boston), size=nrow(Boston)/2, replace=FALSE)
bos_train <- Boston[-test_inds,]

# outcome is per capita crime rate = crim

# forward stepwise regression
bos_fwd <- regsubsets(crim ~., data=bos_train,
                      method="forward", nvmax=ncol(bos_train))

# backward stepwise regression
bos_back <- regsubsets(crim ~., data=bos_train,
                       method="backward", nvmax=ncol(bos_train))

# plot using the method from regsubsets
par(mfrow=c(1,2))
plot(bos_fwd, main="Forward selection", scale="r2")
plot(bos_back, main="Backward selection", scale="r2")

这给了我这些情节,到目前为止一直很好:stepwise regression plots

但是,我不认为图中使用的变量的顺序可以立即解释,并且很难以这种方式比较每种选择方法的模型。看起来plot.regsubsets函数只是使用顺序,因为变量在原始数据框中,因此我通过按算法的前向选择版本的选择顺序重新排序列来进行重新排序,然后重新排序使用向前和向后逐步选择运行regsubsets函数。从理论上讲,这应该给我与以前完全相同的模型序列。

# for plotting to go nicer, re-order variables in forward-selected order
# and re-fit the models
bos_order_fwd <- names(bos_train)[bos_fwd$vorder][-1]
bos_train2 <- bos_train[,c("crim",bos_order_fwd)]
bos_fwd2 <- regsubsets(crim ~., data=bos_train2,
                      method="forward", nvmax=ncol(bos_train2))
bos_back2 <- regsubsets(crim ~., data=bos_train2,
                       method="backward", nvmax=ncol(bos_train2))

# plot using the method from regsubsets
par(mfrow=c(1,2))
plot(bos_fwd2, main="Forward selection", scale="r2")
plot(bos_back2, main="Backward selection", scale="r2")
# observe selection orders in backward selection inconsistent with algo

我想比较所包含的每个变量数量的模型,以便给出这些图:variable selection with reordering。虽然前向选择图看起来像预期的那样,但后向选择图现在表明变量实际上并未按照与向后选择算法一致的顺序进行选择!

通过向后选择,应该始终是这样的情况:一旦排除了变量(白框),它就会从所有较小的模型中排除(填充列的其余部分的白框)。我在重新排序列之前看到这是真的,但在重新排序和重新拟合后不再是这种情况:例如,包含5个非截距变量的模型有{rad,medv,black,dis, zn},一个有4个变量,有{rad,medv,dis,zn},一个有3个变量有{rad,medv,black}。这种对模型嵌套的违反对我没有任何意义。

我还可以通过将bos_back对象中的模型(无需重新排列)与我的bos_back2对象中的模型(重新排列后)进行比较,验证问题出在regsubsets返回的对象中,而不仅仅是摘要或绘图方法。

> # compare the backwards stepwise models of each size
> coef(bos_back, 2)
(Intercept)         rad        medv 
  2.5800690   0.6055753  -0.1947727 
> coef(bos_back2, 2)
(Intercept)         rad        medv 
  2.5800690   0.6055753  -0.1947727 
> coef(bos_back, 3)
(Intercept)         dis         rad        medv 
  4.5777240  -0.4322162   0.5569806  -0.1925573 
> coef(bos_back2, 3)
(Intercept)         rad        medv       black 
 8.12946740  0.54926726 -0.17165228 -0.01534486 
> coef(bos_back, 4)
(Intercept)          zn         dis         rad        medv 
 7.01168924  0.07265221 -1.02796588  0.53498337 -0.22889528 
> coef(bos_back2, 4)
(Intercept)         rad        medv         dis          zn 
 7.01168924  0.53498337 -0.22889528 -1.02796588  0.07265221 
> coef(bos_back, 5)
(Intercept)          zn         dis         rad       black        medv 
11.50765180  0.06724239 -0.93907507  0.49208150 -0.01350222 -0.20607369 
> coef(bos_back2, 5)
(Intercept)         rad        medv       black         dis          zn 
11.50765180  0.49208150 -0.20607369 -0.01350222 -0.93907507  0.06724239 

这些模型序列应该相同,但是当包含3个变量时它们会有所不同。发生了什么事?提前感谢任何见解。

0 个答案:

没有答案