R中的分层多项式回归

时间:2015-04-23 13:32:24

标签: r statistics

我一直在尝试在R中使用顺序多项式回归模型并遇到以下问题:虽然poly(x)提供了一种快速方法,但此函数不遵循层次原则,其中大致指出,在转向更高阶之前,所有较低阶的条款都应包含在模型中。

这里的一个解决方案可能是亲自挑选进入模型的顺序,就像我在下面的玩具数据集中所做的那样

pred<-matrix(c(rnorm(30),rnorm(30)),ncol=2)
y<-rnorm(30)

polys<-poly(pred,degree=4,raw=T)
z<-matrix(c(
#order 2
polys[,2],polys[,6],polys[,9],
#order 3
polys[,3],polys[,7],polys[,10],polys[,12],
#order 4
polys[,4],polys[,8],polys[,11],polys[,13],polys[,14]),
ncol=12)

polyreg3<-function(x){
BICm<-rep(0,dim(x)[2])
for(i in 1:dim(x)[2]){
model<-lm(y~pred[,1]+pred[,2]+x[,1:i]) #include one additional term each time
BICm[i]<-BIC(model)
}
list(BICm=BICm)
}

polyreg3(z)
which.min(polyreg3(z)$BICm)

但对于更大程度的多项式来说,这实际上是不切实际的。我当时想知道,有没有办法处理这个问题,最好是通过调整我的代码?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你不仅需要原始的自变量,还需要在给定度数的情况下创建的所有变量组合。

数据除以三个因变量,原始自变量和由model.frame()创建的额外变量,给定一个度数(为简单起见,这里为2)。

然后,combn()Map()获得额外变量的所有组合,因为选择列的方式是可变的(1到#列)。

拟合的数据集由cbind()创建,它们是独立变量( ind )和原始独立变量(原始)和变量的额外组合(额外)。

最后lm()合适,并获得BIC()值。

如果目标程度较高,则需要多次试验。例如,如果degree为3,则应该应用第二和第三度。

set.seed(1237)
# independent variable
des <- data.frame(y = rnorm(30))
# dependent variables
pred<-matrix(c(rnorm(30), rnorm(30)), ncol=2)
# model frame given degree, 4095 combinations when degree = 4, set degree = 2 for simplicity
polys <- as.data.frame(poly(pred, degree = 2, raw = T))
# original independent variables
original <- polys[,c(names(polys)[names(polys) == "1.0" | names(polys) == "0.1"])]
# extra variables made by model.frame()
extra <- polys[,c(names(polys)[names(polys) != "1.0" & names(polys) != "0.1"])]
# all combinations of extra variables
# Map() for variable q in nCq, do.call() to make list neat
com <- do.call(c, Map(combn, ncol(extra), 1:ncol(extra), simplify = FALSE))
com
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 1 2

[[5]]
[1] 1 3

[[6]]
[1] 2 3

[[7]]
[1] 1 2 3

# data combined, followed by fitting lm()
bic <- lapply(com, function(x) {
  data <- cbind(des, original, extra[, x, drop = FALSE])
  BIC(lm(y ~ ., data))
})

do.call(c, bic)
[1] 100.3057 104.6485 104.8768 103.6572 103.4162 108.0270 106.7262