我从网上复制了这个功能:
# function used to predict Best Subset Selection Regression
predict.regsubsets = function(object, newdata, id, ...) {
form = as.formula(object$call[[2]])
mat = model.matrix(form, newdata)
coefi = coef(object, id = id)
mat[, names(coefi)] %*% coefi
}
但是,当我尝试在另一个函数中使用上述函数时,我不断收到以下错误。
library(leaps)
abc <- function(){
regfit <- regsubsets(lpsa ~.,data = XTraining, nvmax = 8)
predict.regsubsets(regfit, data = XTesting, id = 1)
}
abc()
Error in object$call[[2]] : subscript out of bounds
我已经在R中阅读了?call
。但它并没有帮助我理解这里出了什么问题,特别是$call[[2]]
是什么?
如何编辑上面的函数,以便当我在另一个函数中调用上面的函数时,我不会收到错误?
答案 0 :(得分:1)
罪魁祸首是
form = as.formula(object$call[[2]])
这意味着object
(您传递给函数的变量,在您的示例regfit
中)有一个名为call
的成员,这是一个至少包含两个元素的列表。 [[ ]]
是用于获取列表元素的R运算符。
例如:
> a <- list(1:10, 1:5, letters[15:20])
> a[[2]]
[1] 1 2 3 4 5
> a[[3]]
[1] "o" "p" "q" "r" "s" "t"
然而
> a[[5]] # This does not work, as a only has three elements
Error in a[[5]] : subscript out of bounds
在您的案例?call
中,您不应该检查object
,而是检查生成regsubsets
的函数的帮助。
从?regsubsets
或使用str(regfit)
可以看出,该函数不会返回名为call
的成员的对象。
要从regsubsets
对象获取公式,您需要查看摘要的obj
成员。
例如,您可以使用:
sm <- summary(regfit)
sm$obj$call
答案 1 :(得分:1)
你的错误在abc
函数中。 predict.regsubsets
中的参数称为newdata
,但您引用的是data
....
答案 2 :(得分:0)
object
可能是之前分析的输出(查看从哪个函数获取代码的位置)。第form = as.formula(objects$call[[2]])
行提取用于创建对象的公式,并将其存储在form
中。在接下来的行中,它用于创建新数据的模型矩阵,最后用它来预测新数据。