标签: mgcv

GAM 中的权重选项

我的数据集有许多冗余观察(但每个观察都应该被计数)。所以我考虑在 GAM 中使用“权重”选项,因为它可以显着减少计算时间。

gam函数(在mgcv包中)解释说它们是“等价的”(来自?gam参数weights):

“请注意,例如,权重为 2 相当于进行了两次完全相同的观察。”

但这似乎不对。

yy = c(5,2,8,9)
xx = 1:4
wgts = c(3,2,4,1)
yy2 = rep(yy, wgts)
xx2 = rep(xx, wgts)
mod1 = gam(yy2 ~ xx2)
mod2 = gam(yy ~ xx, weights = wgts)
mod3 = gam(yy ~ xx, weights = wgts / mean(wgts))

predict(mod1,data.frame(xx2=1:4))
predict(mod2,data.frame(xx=1:4))
predict(mod3,data.frame(xx=1:4))
Run Code Online (Sandbox Code Playgroud)

所有三个模型的估计值都是相同的。模型 2 和 3 中的标准误相同,但模型 1 中的标准误不同。所有三个模型中的 GCV 都不同。

我知道 GCV 可能会有所不同。但如果标准误不同,我们怎么能说模型是相同的呢?这是一个错误,或者对此有什么好的解释吗?

regression r mgcv

5
推荐指数
1
解决办法
5217
查看次数

广义加性模型 (GAM) 中的自相关

我有一个关于河流水温、气温和流速的时间序列数据集。我创建了一个 GAM 模型来根据气温和流量预测水温。但是我没有考虑数据集中的自相关。预测变量和因变量中的每个数据点都不是独立的(即第 2 天的气温与第 1 天的气温无关)。

有人可以帮助我使用适当的代码在我的模型中包含某种形式的自相关度量(AR1?)。据我了解,我需要使用gamm()函数而不是gam()函数?

我目前的模型是这样的:

model <- gam(W.T.Mean ~ s(T.Mean) +s(Discharge), data = Pre_regulation_temp)

WTMean 是平均每日水温。T.Mean 是平均每日气温。排放量是平均日流量

提前致谢

model r time-series gam mgcv

5
推荐指数
1
解决办法
4640
查看次数

如何在广义可加模型中指定两个因子变量的非线性交互作用 [R]

我有一个时间序列数据集,其中包含一个连续的结果变量和两个因子预测变量(一个具有 6 个级别,一个具有 2 个级别)。

我想对连续变量上的两个因子变量的非线性交互进行建模。

这是我到目前为止的模型:

library(mgcv)

model <- bam(
    outcome ~
        factor_1 + factor_2 +
        s(time, k = 9) +
        s(time, by = factor_1, k = 9) +
        s(time, by = factor_2, k = 9),
    data = df
)

summary(model)
Family: gaussian 
Link function: identity 

Formula:
outcome ~ factor_1 + factor_2 + s(time, k = 9) + s(time, by = factor_1, 
    k = 9) + s(time, by = factor_2, k = 9)

Parametric coefficients:
            Estimate Std. Error t …
Run Code Online (Sandbox Code Playgroud)

r gam mgcv

5
推荐指数
1
解决办法
1336
查看次数

是否可以在 gam 平滑期间指定响应变量的下限?

z我正在尝试适应光滑的表面x并使用具有包中功能的y公式。我的目标是根据和的新值预测响应。z ~ s(x, y)gammgcvzxy

在我的实际情况下,z应该是正数负数z是没有意义的。然而,预测的zs 有时是负数。似乎对于某些区域,训练数据中没有足够的点来z 准确估计。

我的问题是:有没有办法在 smooth in 期间指定 的下界,以便以后我不会得到负数s ?zgamzpredict

下面是重现此问题的最小示例。

library(mgcv)

x <- seq(0.1, 1, by = 0.01)
y <- seq(0.1, 1, by = 0.01)
dtt <- expand.grid(x = x, y = y)

set.seed(123)
dtt$xp <- dtt$x + rnorm(nrow(dtt)) / 100
dtt$yp <- dtt$y + rnorm(nrow(dtt)) / 100

dtt$z <- 1 / …
Run Code Online (Sandbox Code Playgroud)

r smoothing gam mgcv

5
推荐指数
0
解决办法
1051
查看次数

具有“gp”更平滑的 GAM:在新位置进行预测

我正在使用以下地理附加模型

library(gamair)
library(mgcv)

data(mack)    
mack$log.net.area <- log(mack$net.area)

gm2 <- gam(egg.count ~ s(lon,lat,bs="gp",k=100,m=c(2,10,1)) +
                       s(I(b.depth^.5)) +
                       s(c.dist) +
                       s(temp.20m) +
                       offset(log.net.area),
                       data = mack, family = tw, method = "REML")
Run Code Online (Sandbox Code Playgroud)

如何使用它来预测没有协变量数据的egg.count新位置的值,如?(lon/lat)kriging

例如,假设我想egg.count在这些新位置进行预测

    lon lat
1  -3.00  44
4  -2.75  44
7  -2.50  44
10 -2.25  44
13 -2.00  44
16 -1.75  44
Run Code Online (Sandbox Code Playgroud)

b.depth但这里我不知道协变量( , c.dist, temp.20m, )的值log.net.area

regression r gam mgcv kriging

5
推荐指数
1
解决办法
1118
查看次数

使用 mgcv 将样条添加到多项 logit 模型

我正在尝试训练一个多项式 logit 模型,当我在做的时候,我不妨把它变成一个 GAM 并在混合中添加样条。

我曾尝试使用mgcv,但到目前为止我只设法生成错误。以下是使用iris数据集的一些示例。

你知道如何让它收敛吗?
谢谢

library(tidyverse)
library(mgcv)
my_iris <- iris %>% 
  mutate(y =    as.integer(as.factor(Species)) -1) 
set.seed(8)

# this works (no spline)
mod1 <- gam(
  data = my_iris,
  formula = list(
    y ~ Sepal.Length + Petal.Length,
      ~ Sepal.Length + Petal.Length),
  family=multinom(K=2))
Run Code Online (Sandbox Code Playgroud)

模型 2(花瓣宽度上的 1 个样条)崩溃并显示以下警告:

Warning message:
 In newton(lsp = lsp, X = G$X, y = G$y, Eb = G$Eb, UrS = G$UrS, L = G$L,  :
Fitting terminated with step failure - check …
Run Code Online (Sandbox Code Playgroud)

r gam mgcv multinomial logistic-regression

5
推荐指数
0
解决办法
632
查看次数

为什么游戏的拟合时间会随着使用的线程数的增加而增加?

常识表明,我们使用的核心或线程越多,任何计算都应该更快。如果扩展性不好,则计算时间不会随着线程数量的增加而改善。因此,当使用 R 包 MGCV 拟合游戏时,为什么增加线程会大大减少计算时间(如本示例所示)?:

\n\n
library(boot) # loads data "amis"\n\nt1<-Sys.time()\n\nmod <- gam(speed ~ s(period, warning, pair, k = 12), data = amis, family=tw (link = log),method="REML",control=list(nthreads=1))  # \n\nt2<-Sys.time()\n\nprint("Model fitted in:")\nprint(t2-t1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果将本例中的线程数增加到 2、4 等,拟合过程将花费越来越长的时间,而不是像我们预期的那样更快。就我的具体情况而言:

\n\n

1 个线程:32.85333 秒

\n\n

2 个线程:50.63166 秒

\n\n

3 个线程:1.2635 分钟

\n\n

为什么是这样?如果我做错了什么,我该怎么做才能获得所需的行为(即随着线程数量的增加而提高性能)?

\n\n

一些注意事项:

\n\n

1) 这里显示的模型、族和求解方法没有特别意义。这只是一个例子。然而,我\xe2\x80\x99已经用真实的数据和合理的模型解决了这个问题(但为了简单起见,我使用这个小代码来举例说明这个问题)。数据、模型的函数形式、族、求解方法似乎都是无关紧要的:经过多次测试后,我总是得到相同的行为,即增加使用的线程数量,降低性能(即增加计算时间)。

\n\n

2)操作系统:Linux Ubuntu 18.04;

\n\n

3) 架构:DELL Power Edge,配备两个物理 CPU Intel Xeon X5660,每个 CPU 具有 6 个核心 @2800 Mhz,每个核心能够处理 2 个线程(即总共 24 个线程)。80Gb 内存。

\n\n

4) …

performance multithreading r gam mgcv

5
推荐指数
0
解决办法
1072
查看次数

mgcv:为“全局”分组平滑指定因子平滑交互

我找到了Pedersen 等人的Hierarchical GAM 预印本(和GH repo )。对于功能反应的组间变异建模非常有帮助,但我遇到了绊脚石。

我有一些时间序列数据(随着时间的推移计数),具有以下基本期望:

  1. 计数和时间之间存在感兴趣的全局功能响应;
  2. 全局函数在几个“固定”组 (2-5) 之间变化,可能具有类似的平滑参数;
  3. 每年与该全局函数的“随机”偏差似乎存在系统趋势(即,功能响应的形状朝一致的方向漂移);但
  4. 年度偏差趋势对"固定"组的应用有所不同。

在这里,我尝试用一​​个人为的例子来说明,因为我担心我的描述不够充分。我为两个“固定”组/治疗模拟 20 个重复(年度)时间序列。在对照(trt == 0)中,年度变化很小。在治疗中(trt == 1),响应的形状存在系统趋势。

library(reshape)
library(dplyr)
library(ggplot2)
set.seed(2020)
n_yr <- 20
n_trt <- 2
n_x <- 10
dat <- tibble(yr = rep(seq(0, n_yr - 1), n_trt)) %>%
  expand.grid.df(tibble(x = rep(seq(0, 1, length.out = 10), n_trt),
                        tweak = c(rep(0, 15), rep(0.02, 5)),
                        trt = rep(0:1, each = n_x)), .) %>%
  mutate(e = rnorm(n_x * n_yr * n_trt, 0, 0.3),
         y = …
Run Code Online (Sandbox Code Playgroud)

r time-series smoothing gam mgcv

5
推荐指数
0
解决办法
771
查看次数

从另一个包中调用时,无法从 mgcv 访问“ldTweedie”函数

我在自己的包中使用了 mgcv 包,到目前为止一切运行良好。但是,我尝试将 Tweedie 系列对象(“Tweedie()”、“tw()”)引入到我的包中,但是在尝试使用后者时出现错误。

函数就这么简单(这里简化了):

#' @importFrom mgcv tw
#'
.FamilyLink <- function(link) {
       familyObject <- tw(link = link)
       return(familyObject)
}
Run Code Online (Sandbox Code Playgroud)

我在 NAMESPACE 文件中有这个

importFrom(mgcv,tw)
Run Code Online (Sandbox Code Playgroud)

所以在安装包后我调用我的函数(非导出,它通常在我的包的其他函数中使用)

fam <- MyPackage:::.FamilyLink("log")
fam$aic(1, 1, NULL, 1, 1)
Error in ldTweedie(y, mu, p = p, phi = scale) : 
  could not find function "ldTweedie"
Run Code Online (Sandbox Code Playgroud)

然后我尝试添加:

importFrom(mgcv,ldTweedie)
importFrom(mgcv,tw)
Run Code Online (Sandbox Code Playgroud)

安装了软件包并遇到了同样的问题。但是,如果我使用 devtools 加载我的包:

devtools::load_all("MyPackage")
fam <- .FamilyLink("log")
fam$aic(1, 1, NULL, 1, 1)
[1] 4.05723
Run Code Online (Sandbox Code Playgroud)

一切正常。所以我想知道我在这里做错了什么,或者我怎样才能通过安装而不使用 load_all() 来让我的包/函数工作?谢谢

namespaces r mgcv tweedie

5
推荐指数
1
解决办法
93
查看次数

R 中 GAM 中参数项的 Concurvity 与 mgcv

我有一个 GAM 模型(如下),其中 SST_mean 和 NAO 是数值,周期和区域是分类因素。我使用 mgcv 中的 concurvity 函数检查了 concurvity。

m2 <- gam(Strandings ~ s(SST_mean) + s(NAO, bs="re") + Cycle + Region, 
      family=poisson, data=DAT_ST, method = "REML")
Run Code Online (Sandbox Code Playgroud)

下面的初始结果具有相当高的值,表明模型中存在曲线。

> concurvity(m2, full = TRUE)
                     para     s(SST_mean)  s(NAO)
          worst    0.8944583  0.7532177   0.7131497
          observed 0.8944583  0.5784295   0.7131497
          estimate 0.8944583  0.5309899   0.7131497
Run Code Online (Sandbox Code Playgroud)

我进行了成对比较,看起来曲线问题实际上是在参数项之间而不是在平滑项之间或在平滑项和参数项之间

 > concurvity(m2, full = FALSE)
 $worst
                para        s(SST_mean)    s(NAO)
 para        1.000000e+00   1.736827e-25   0.001064966
 s(SST_mean) 1.746022e-25   1.000000e+00   0.351366528
 s(NAO)      1.064966e-03   3.513665e-01   1.000000000
Run Code Online (Sandbox Code Playgroud)

是否有任何原因,这是否是我的模型的问题。或者因为参数是分类的,出于某种原因这是可以预料的吗?我读到的高于 0.8 的人表示应该解决的曲线问题,但我在文献中找不到任何特定的阈值。有没有人可以推荐的参考资料?

r model-fitting gam mgcv

5
推荐指数
0
解决办法
314
查看次数