尝试构建gausspr模型并使用预测来预测输出。复制来自predict.gausspr文档的代码。
data(promotergene)
## create test and training set
ind <- sample(1:dim(promotergene)[1],20)
genetrain <- promotergene[-ind, ]
genetest <- promotergene[ind, ]
## train a support vector machine
gene <- gausspr(Class~.,data=genetrain,kernel="rbfdot",
kpar=list(sigma=0.015))
## predict gene type probabilities on the test set
genetype <- predict(gene,genetest,type="probabilities")
这很好用。现在,当我尝试直接调用predict.gausspr时,它失败了。可以直接调用这个S4方法吗? 此外,在这种情况下,任何S4方法或特殊情况都是这种情况吗?
> genetype <- predict.gausspr(gene,genetest,type="probabilities")
Error: could not find function "predict.gausspr"
kernlab
包已正确加载,并且能够执行?predict.gausspr
并查看备注
答案 0 :(得分:2)
我猜你的意思是kernlab包中的gausspr()
函数。使用?gausspr
中的代码段,我看到了
library(kernlab)
data(iris)
test <- gausspr(Species~., data=iris, var=2)
predict(test, iris[,-5])
test
确实是一个S4对象
> isS4(test)
[1] TRUE
> class(test)
[1] "gausspr"
attr(,"package")
[1] "kernlab"
使用showMethods()
和selectMethod()
(为简洁起见编辑输出)发现了S4方法
> showMethods("predict")
Function: predict (package stats)
object="ANY"
object="gausspr"
object="kfa"
object="kha"
object="kpca"
object="kqr"
object="ksvm"
object="lssvm"
object="onlearn"
object="rvm"
> showMethods(class=class(test), where=search())
Function: alphaindex (package kernlab)
object="gausspr"
...
Function: predict (package stats)
object="gausspr"
...
> selectMethod("predict", class Method Definition:
function (object, ...)
{
.local <- function (object, newdata, type = "response", coupler = "minpair")
{
sc <- 0
type <- match.arg(type, c("response", "probabilities",
"votes", "variance"))
...
如果没有相关的预测,gausspr方法,那么我们最终会得到一个预测的ANY方法,它实际上会调用methods("predict")
发现的S3方法。
使用
发现帮助页面?"predict,gausspr-method"
如果方法失败并且您想调试它,那么通常最简单的方法是使用?traceback
找出错误发生的位置,并?recover
来识别错误问题更详细。这是一个错误
> predict(test, mtcars)
Error in eval(expr, envir, enclos) : object 'Sepal.Length' not found
我们可以看到&#39;调用堆栈&#39;从1(通用&#39;预测&#39;)到2(方法&#39;预测,gausspr-mehtod&#39;)到3(.local函数,在gausspr方法中定义)等。< / p>
> traceback()
9: eval(expr, envir, enclos)
8: eval(predvars, data, env)
7: model.frame.default(object, data, xlev = xlev)
6: model.frame(object, data, xlev = xlev)
5: model.matrix.default(delete.response(terms(object)), as.data.frame(newdata),
na.action = na.action)
4: model.matrix(delete.response(terms(object)), as.data.frame(newdata),
na.action = na.action)
3: .local(object, ...)
2: predict(test, mtcars)
1: predict(test, mtcars)
将error
选项(请参阅?options
)设置为recover
,然后重试,选择.local
函数中的帧编号,使其位于方法体内。
> options(error=recover)
> predict(test, mtcars)
Error in eval(expr, envir, enclos) : object 'Sepal.Length' not found
Enter a frame number, or 0 to exit
1: predict(test, mtcars)
2: predict(test, mtcars)
3: .local(object, ...)
4: model.matrix(delete.response(terms(object)), as.data.frame(newdata), na.act
5: model.matrix.default(delete.response(terms(object)), as.data.frame(newdata)
6: model.frame(object, data, xlev = xlev)
7: model.frame.default(object, data, xlev = xlev)
8: eval(predvars, data, env)
9: eval(expr, envir, enclos)
Selection: 3
Called from: eval(predvars, data, env)
Browse[1]> ls()
[1] "coupler" "ncols" "newdata" "nrows" "object" "oldco" "sc"
[8] "type"
使用options(error=NULL)
恢复正常错误行为。
调试S4方法有几件事要做。第一种是在所选方法上使用调试器
debug(selectMethod("predict", class(test)))
第二个是跟踪方法
trace("predict", browser, signature=class(test))
(停止跟踪untrace("predict", signature=class(test))
在这种特殊情况下,您会看到函数体位于名为.local
的嵌套函数中。在外部函数上设置调试器是不够的,而是需要在外部函数中断,然后逐步执行直到.local已经定义而不是评估,并设置.local上的调试器,如(为了简洁而编辑输出)
> trace(predict, browser, signature=class(test))
Tracing specified method for function "predict" in environment
<namespace:stats>
Warning: Tracing only in the namespace; to untrace you will need:
untrace("predict", where = getNamespace("stats"))
[1] "predict"
attr(,"package")
[1] "stats"
> predict(test, iris[,-5])
Tracing predict(test, iris[, -5]) on entry
Called from: eval(expr, envir, enclos)
Browse[1]> n
debug: {
.local <- function (object, newdata, type = "response", coupler = "minpair")
{
sc <- 0
type <- match.arg(type, c("response", "probabilities",
...
Browse[2]> n
debug: .local(object, ...)
Browse[2]> debug(.local)
Browse[2]> n
debugging in: .local(object, ...)
debug: {
sc <- 0
type <- match.arg(type, c("response", "probabilities", "votes",
...
Browse[3]>
kernlab软件包的作者 not 提供了S3风格的函数predict.gausspr
,即使S4指南(?setMethod
)表明他们这样做了。这样可以简化调试,例如debug(kernlab:::predict.gausspr)
。