我一直在尝试在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)
但对于更大程度的多项式来说,这实际上是不切实际的。我当时想知道,有没有办法处理这个问题,最好是通过调整我的代码?
答案 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