在某些时候,glm.fit
正在被调用。这意味着您调用的函数之一或这些函数调用的函数之一正在使用glm
, glm.fit
。
另外,正如我在上面的评论中提到的,这是一个警告而不是错误,这会产生很大的不同。您不能从警告中触发任何 R 的调试工具(在有人告诉我我错了之前使用默认选项 ;-)。
如果我们更改选项以将警告转化为错误,那么我们就可以开始使用 R 的调试工具了。从?options
我们有:
‘warn’: sets the handling of warning messages. If ‘warn’ is
negative all warnings are ignored. If ‘warn’ is zero (the
default) warnings are stored until the top-level function
returns. If fewer than 10 warnings were signalled they will
be printed otherwise a message saying how many (max 50) were
signalled. An object called ‘last.warning’ is created and
can be printed through the function ‘warnings’. If ‘warn’ is
one, warnings are printed as they occur. If ‘warn’ is two or
larger all warnings are turned into errors.
所以如果你跑
options(warn = 2)
然后运行你的代码,R 会抛出一个错误。此时,您可以运行
traceback()
查看调用堆栈。这是一个例子。
> options(warn = 2)
> foo <- function(x) bar(x + 2)
> bar <- function(y) warning("don't want to use 'y'!")
> foo(1)
Error in bar(x + 2) : (converted from warning) don't want to use 'y'!
> traceback()
7: doWithOneRestart(return(expr), restart)
6: withOneRestart(expr, restarts[[1L]])
5: withRestarts({
.Internal(.signalCondition(simpleWarning(msg, call), msg,
call))
.Internal(.dfltWarn(msg, call))
}, muffleWarning = function() NULL)
4: .signalSimpleWarning("don't want to use 'y'!", quote(bar(x +
2)))
3: warning("don't want to use 'y'!")
2: bar(x + 2)
1: foo(1)
4:
在这里您可以忽略标记和更高的帧。我们看到foo
调用bar
并bar
生成了警告。这应该告诉你哪些函数正在调用glm.fit
。
如果你现在想调试它,我们可以转向另一个选项,告诉 R 在遇到错误时进入调试器,并且由于我们已经发出警告错误,我们将在触发原始警告时得到一个调试器。为此,您应该运行:
options(error = recover)
这是一个例子:
> options(error = recover)
> foo(1)
Error in bar(x + 2) : (converted from warning) don't want to use 'y'!
Enter a frame number, or 0 to exit
1: foo(1)
2: bar(x + 2)
3: warning("don't want to use 'y'!")
4: .signalSimpleWarning("don't want to use 'y'!", quote(bar(x + 2)))
5: withRestarts({
6: withOneRestart(expr, restarts[[1]])
7: doWithOneRestart(return(expr), restart)
Selection:
然后,您可以进入任何这些框架,以查看引发警告时发生的情况。
要将上述选项重置为默认值,请输入
options(error = NULL, warn = 0)
至于您引用的具体警告,您很可能需要在代码中允许更多迭代。一旦你发现调用的是什么,就可以使用-seeglm.fit
来计算如何将control
参数传递给它。glm.control
?glm.control