我正在尝试在R中绘制一个gam对象,这是我用gam包创建的。我收到Error in 1:object$nsdf : argument of length 0 when using plot.gam中报告的相同错误。但是,在那里发现的解决方案,更新到最新版本(我认为),对我来说不起作用。我正在运行R 3.3.1,gam 1.12和mgcv 1.8.12(mgcv是plot.gam函数的来源)。
不幸的是,我无法分享我正在使用的数据。但是,以下代码 - 直接从Intro的p.294中提取。使用R进行统计学习 - 为我重现错误:
library(gam)
library(ISLR) # contains the Wage dataset used here
gam.mod <- gam(wage ~ s(year, 4) + s(age, 5) + education, data = Wage)
plot(gam.mod)
有人知道这里发生了什么或如何解决它?
谢谢。
答案 0 :(得分:4)
如果您仍然收到此消息,则需要将mgcv
和gam
包更新为最新版本。 2018年2月,gam
包裹发生了重大变化:Could not find function plot.gam。这意味着,由gam
包安装的GAM现在具有“Gam”类,即使加载了mgcv
包,plot
也不会选择mgcv::plot.gam
来绘制它。 / p>
但是,在R会话中同时使用这两个包仍然是不安全的。因此,强烈建议在2016年提出以下建议。
<强>建议强>
这个玩具功能可能是一个好主意,以检查R会话是否可以运行GAM分析。
GAM_status <- function () {
if (all(c("gam", "mgcv") %in% .packages())) print("Not OK")
else print("OK")
}
nsdf
是严格自由度的数量,这是mgcv
专用的术语。如您所述:mgcv
是plot.gam
函数的来源。
问题是你的R会话中有两个不兼容的软件包gam
和mgcv
。您将gam.mod
与gam::gam
匹配,但随后使用mgcv::plot.gam
绘制模型。
注意,使用::
通常是正确的将在此处失效。通常,当两个包具有一些内部屏蔽功能时,::
是补救措施。但是,对于mgcv
和gam
,这是完全不可能的。所以我的建议是,如果您使用gam
,请不要在R会话中触摸mgcv
,反之亦然。
所以,我开始一个新的R会话,并执行以下操作,一切都很好!
library(gam)
library(ISLR) # contains the Wage dataset used here
gam.mod <- gam(wage ~ s(year, 4) + s(age, 5) + education, data = Wage)
par(mfrow = c(2,2)); plot(gam.mod)
感谢您的回答。我从未真正加载
mgcv
,我只是假设它是gam
的依赖项。我开始了一个新的R会话和你提供的代码。我发现它实际上是导致同样问题的car
库。
mgcv
和gam
并不相互依赖,但由于mgcv
比gam
更受欢迎,因此许多软件包都依赖于mgcv
,因为例如,car
:
car: Companion to Applied Regression
Functions and Datasets to Accompany J. Fox and S. Weisberg, An R Companion to
Applied Regression, Second Edition, Sage, 2011.
Version: 2.1-3
Depends: R (≥ 3.2.0)
Imports: MASS, mgcv, nnet, pbkrtest (≥ 0.4-4), quantreg, grDevices, utils,
stats, graphics
请注意“导入”字段,library(car)
会同时加载这些包。
答案 1 :(得分:0)
我的mgcv
版本是1.8-28,但是我仍然遇到这个问题。考虑将所有char变量转换为因数,然后重新运行gam()
或bam()
。它对我有用。