我是R的新手,目前正在读一本书"广义的添加模型",一本R by Wood(2006)的介绍,并经历了一些练习,特别是关于空气污染和死亡的部分,这是我感兴趣的领域.使用mgcv包我运行以下模型.
library(gamair)
library(mgcv)
data(chicago)
ap1<-gam(death ~ pm10median + so2median + o3median +s(time,bs="cr",k=200)+ s(tmpd,bs="cr"), data=chicago,family=poisson)
Run Code Online (Sandbox Code Playgroud)
如何提取pm10median的效果估计值和x的95%CI并将输出导出为CSV或任何其他选项?
我使用R版本2.15.1(2012-06-22)和mgcv版本1.7-22
我在R中加载了以下一组包:
library(sqldf)
library(timeDate)
library(forecast)
library(xts)
library(tseries)
library(MASS)
library(mgcv)
碰巧我无法运行一个简单的模型(我省略了代码).甚至从帮助页面获取的示例代码:
dat = gamSim(1,n=400,dist="normal",scale=2)
b = gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat)
给出错误:
Error in qr.qty(qrc, sm$S[[l]]) :
NA/NaN/Inf in foreign function call (arg 5)
In addition: Warning message:
In smoothCon(split$smooth.spec[[i]], data, knots, absorb.cons, scale.penalty = scale.penalty, :
number of items to replace is not a multiple of replacement length
请注意,如果我只是加载包mgcv然后立即使用示例代码,一切正常.如果我只是加载所有包并运行示例代码,它也可以工作.如果我,它就行不通
显然,一般环境中的变量定义会破坏包的功能.
有任何已知问题吗?如果我加载各种包,是否有必须遵守的一般规则?我可以编写"扰乱"包mgcv的代码吗?
一个例子:
library(mgcv)
N=1000
x1 = seq(1:N)
x2 = log(x1)
x3 = sqrt(x1)
fac1 = ceiling(rnorm(N)*3)
fac2 = ceiling(runif(N)*3)
y = fac1*x2 + x1*x2 + x2 + x3*x2 + x2*(x1/x3)^(.8+fac2/10) + rnorm(N)*x2
mod = gam(y~
s(as.factor(fac1),bs="re",by=x2)
+ s(x2)
+ s(x1,by=x2)
+ s(x3,by=x2)
+ te(x1,x3,by=x2, by=as.factor(fac2))
)
Run Code Online (Sandbox Code Playgroud)
最后一个张量不想让我两次互动.第一个是连续变量,它将模型矩阵中的每个项相乘,第二个是一个因子 - 它为每个因子级别创建不同的表面.
编辑:最后一个术语相当于te(x1*x2,x1*x3,by=as.factor(fac2)).但如果我发明了一个新变量x1x2 = x1*x2,我就失去了调用的能力predict.gam
我该如何编程呢?我需要上诉SmoothCon还是其他一些?如果是这样,一个如何实施的例子将非常有用.
谢谢!
(PS:我知道模型的异方性.特征,而不是bug.)
我试图在具有一个固定效应的GAMM模型中指定随机截距和随机斜率项.
我已经使用mgcv库中的以下代码成功地使用随机截距拟合了一个模型,但现在无法确定gamm()函数中随机斜率的语法:
M1 = gamm(dur ~ s(dep, bs="ts", k = 4), random= list(fInd = ~1), data= df)
Run Code Online (Sandbox Code Playgroud)
如果我在线性混合效果模型中同时使用随机截距和斜率,我会按以下方式编写它:
M2 = lme(dur ~ dep, random=~1 + dep|fInd, data=df)
Run Code Online (Sandbox Code Playgroud)
在gamm()支持文档指出随机条款需要在给予list的形式为lme(),但我找不到任何解释的例子,其中包括斜率和截距项.任何建议/解决方案将不胜感激.
我适合使用广义加模式gam从mgcv包.我有一个数据表,包含我的因变量Y,一个自变量X,其他自变量Oth和一个两级因子Fac.我想适合以下模型
Y ~ s(X) + Oth
但是,附加约束条件是该s(X)术语仅适用于因子的两个等级之一Fac==1.其他术语Oth应与整个数据相符.
我尝试过探索,s(X,by=Fac)但这会偏向于适合Oth.换句话说,我想表达的信念X涉及到Y只有Fac==1,否则就没有意义模型X.
我试图在R中绘制一个gam对象,这是我用gam包创建的.我收到在1中的错误中报告的相同错误:对象$ nsdf:使用plot.gam时长度为0的参数.但是,在那里发现的解决方案,更新到最新版本(我认为),对我来说不起作用.我正在运行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)
Run Code Online (Sandbox Code Playgroud)
有人知道这里发生了什么或如何解决它?
谢谢.
在R中,我想使用具有分类变量的gam模型。我以为可以做到(cat是绝对变量)。
lm(data = df, formula = y ~ x1*cat + x2 + x3);
Run Code Online (Sandbox Code Playgroud)
但是我不能做这样的事情:
gam(data = df, formula = y ~ s(x1)*cat + s(x2) + x3)
Run Code Online (Sandbox Code Playgroud)
但以下工作原理:
gam(data = df, formula = y ~ cat + s(x1) + s(x2) + x3)
Run Code Online (Sandbox Code Playgroud)
如何将分类变量仅添加到样条线之一?
我想保持清楚,并::在各行中使用符号来拟合mgcv::gam。在模型调用中使用符号时,我偶然发现了一件事情mgcv::s。带有可复制示例/错误的代码如下所示。
原因可能是因为我在模型公式中使用了这种表示法,但是我无法弄清楚为什么它不起作用/不允许这样做。这可能是关于语法的非常具体的东西(我想可能不是特定于mgcv的东西),但是也许有人可以帮助我理解这一点以及我对R的理解。预先感谢您。
library(mgcv)
dat <- data.frame(x = 1:10, y = 101:110)
# this results in an error: invalid type (list)...
mgcv::gam(y ~ mgcv::s(x, bs = "cs", k = -1), data = dat)
# after removing the mgcv:: in front of s everything works fine
mgcv::gam(y ~ s(x, bs = "cs", k = -1), data = dat)
# outside of the model call, both calls return the desired function
class(s)
# [1] "function"
class(mgcv::s)
# …Run Code Online (Sandbox Code Playgroud) 我正在研究一个模型,其中包含多个 RE 和其中一个变量的样条曲线,因此我尝试使用gam(). 但是,我遇到了内存耗尽限制错误(即使我在 128GB 的集群上运行它)。即使我只使用一个 RE 运行最简单的模型,也会发生这种情况。当我使用时,相同的模型(减去样条线)运行平稳,只需几秒钟(或完整模型的几分钟)lmer()。
我想知道是否有人知道为什么gam()和lmer()以及任何潜在的解决方案之间存在差异。
这是一些带有模拟数据和最简单模型的代码:
library(mgcv)
library(lme4)
set.seed(1234)
person_n <- 38000 # number of people (grouping variable)
n_j <- 15 # number of data points per person
B1 <- 3 # beta for the main predictor
n <- person_n * n_j
person_id <- gl(person_n, k = n_j) #creating the grouping variable
person_RE <- rep(rnorm(person_n), each = n_j) # creating the random errors
x <- rnorm(n) # creating …Run Code Online (Sandbox Code Playgroud) 在 R 中,您可以mgcv使用包含诸如log或 之类的变换的公式来拟合包中的 GAM 模型sqrt,并且默认情况下model.frame会返回 (仅返回公式中指定的已应用变换的变量)。
有什么办法可以恢复未变形的吗data.frame?
例子:
reg <- mgcv::gam(log(mpg) ~ disp + I(hp^2), data=mtcars)
回报
> head(reg$model,3)
log(mpg) disp I(hp^2)
Mazda RX4 3.044522 160 12100
Mazda RX4 Wag 3.044522 160 12100
Datsun 710 3.126761 108 8649
但是,我想从模型中获取这个未转换的数据集model.frame
mpg disp hp
Mazda RX4 21.0 160 110
Mazda RX4 Wag 21.0 160 110
Datsun 710 22.8 108 93
一些背景:newdata大多数模型predict()函数的参数需要未转换的数据,因此我无法将其model.frame反馈到predict() …
mgcv ×10
r ×10
gam ×5
regression ×3
interaction ×1
lm ×1
lme4 ×1
mixed-models ×1
plot ×1
random ×1
spline ×1
statistics ×1
syntax ×1