Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多项GAM (MGCV)和/或多元logistic回归的模型选择

多项GAM (MGCV)和/或多元logistic回归的模型选择
EN

Stack Overflow用户
提问于 2020-04-03 14:27:56
回答 1查看 510关注 0票数 2

我正在尝试根据我进行的一个实验中的4个连续变量对逻辑响应进行建模。最初,我使用了多元回归,并获得了相当好的结果,但最近有人建议我应该使用GAMs代替。对于如何正确地为GLM选择模型,以及如何解释我从多元回归GLM中得到的一些警告,我感到有点迷茫。我怀疑我的问题来自于过度适应,但我不知道如何解决这些问题。

基本上,问题是:对这些数据建模的最佳/最简约的方法是什么?

df:

代码语言:javascript
运行
AI代码解释
复制
df <- structure(list(response = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                            0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                            0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0),
               V1 = c(14.2,13.67, 13.05, 14.18, 13.4, 14.12, 14.22, 14.15, 13.35, 13.67, 
                      18.58, 18.27, 18.6, 17.94, 18.38, 18.98, 18.15, 19, 18.55, 18.53, 
                      20.77, 21.65, 21.03, 21.57, 21.25, 21.63, 21.6, 21.09, 21.62, 
                      21.6, 26.23, 26.52, 25.7, 26.57, 26.6, 26.25, 26.48, 26.26, 26.25, 
                      26.4, 28.98, 29.45, 29.2, 29.65, 29.38, 28.6, 28.42, 28.95, 28.85, 
                      28.8), V2 = c(27.2, 37.98, 24.63, 32.97, 30.27, 18.66, 13.77, 
                      33.99, 15.8, 21.32, 14.21, 15.81, 35.83, 21.64, 26.93, 38.62, 
                      34.03, 18.76, 24.12, 29.67, 29.83, 33.22, 27.11, 24.92, 21.72, 
                      39.02, 12.93, 18.44, 36.34, 15.81, 13.29, 21.04, 19.05, 33.62, 
                      30.52, 16.07, 28.43, 24.97, 39.9, 37.05, 19.31, 31.3, 34.08, 
                      13.63, 25.1, 28.93, 22.36, 34.69, 39.5, 16.41), 
               V3 = c(8.06, 7.87, 7.81, 7.72, 8.04, 7.66, 7.72, 7.87, 7.72, 7.98, 7.59, 7.9, 
                      8.08, 7.64, 8.02, 7.73, 7.77, 7.74, 7.66, 7.71, 8.05, 7.68, 7.63, 
                      7.7, 7.64, 7.8, 7.7, 7.98, 7.86, 7.68, 7.65, 7.74, 7.99, 7.75, 
                      7.91, 7.64, 7.69, 7.78, 7.69, 7.66, 7.72, 7.76, 7.71, 7.88, 7.63, 
                      7.7, 7.99, 7.82, 7.75, 7.93), 
               V4 = c(362.12, 645.38, 667.54, 
                      957.44, 391.84, 818.34, 732.91, 649.05, 722.02, 406.71, 918.9, 
                      471.32, 363.77, 926.82, 385.4, 1038.91, 850.67, 715.11, 964.79, 
                      890.11, 370.51, 1078.68, 1083.7, 893.76, 1026.1, 887.29, 737.68, 
                      406.76, 690.39, 872.8, 847.26, 738.53, 397.33, 895.3, 563.93, 
                      991.17, 957.28, 734.55, 1140.5, 1199.12, 817.17, 800.5, 992.82, 
                      533.45, 1123.29, 943.25, 411.59, 745.22, 929.75, 460.82)), 
          row.names = c(NA,-50L), class = "data.frame")

我应该注意到,通过做实验和了解系统,我知道V1和V2对响应的影响最大。您还可以通过绘制这些变量的响应图来查看,因为所有积极的响应都聚集在这个2-D空间中。另外,看看一些临时的样条,似乎V1与响应是线性相关的,V2是二次的,V3可能根本不是,V4可能是弱二次的。

另一个重要的注意事项: V3和V4基本上是同一事物的两个不同度量,因此它们高度相关,不会在任何模型中一起使用。

因此,首先我尝试在多逻辑回归中对所有这些模型进行建模:有人建议我在模型选择中测试一大堆不同的模型,所以我将它们写在一个列表中,并在循环中运行它们:

代码语言:javascript
运行
AI代码解释
复制
formulas <- list(# single predictors
                 response ~ V1,
                 response ~ V2,
                 response ~ V3,
                 response ~ V4,

                 # two predictors
                 response ~ V1 + V2,
                 response ~ V1 + V3,
                 response ~ V1 + V4,
                 response ~ V2 + V3,
                 response ~ V2 + V4,

                 # three predictors
                 response ~ V1 + V2 + V3,
                 response ~ V1 + V2 + V4,

                 # start quadratic models
                 response ~  V2 + I(V2^2) + V1 + I(V1^2),
                 response ~  V2 + I(V2^2) + V1 + I(V1^2) + V3,
                 response ~  V2 + I(V2^2) + V1 + I(V1^2) + V4,
                 response ~ V1 + V2 + I(V1^2),
                 response ~ V1 + V2 + I(V1^2) + V3,
                 response ~ V1 + V2 + I(V1^2) + V4,
                 response ~ V1 + I(V1^2),
                 response ~ V1 + V2 + I(V2^2),
                 response ~ V1 + V2 + I(V2^2) + V3,
                 response ~ V1 + V2 + I(V2^2) + V4,
                 response ~  V2 + I(V2^2),
                 response ~  V2 + I(V2^2) + V1 + I(V1^2),
                 # add interactions
                 response ~ V1 + V2 + V1*V2,
                 response ~ V1 + V2 + V1*V2 + V3,
                 response ~ V1 + V2 + V1*V2 + V4,
                 # quadratic with interaction
                 response ~ V1 + V2 + V1*V2 + V3 + I(V1^2),
                 response ~ V1 + V2 + V1*V2 + V3 + I(V2^2),
                 response ~ V1 + V2 + V1*V2 + V4 + I(V1^2),
                 response ~ V1 + V2 + V1*V2 + V4 + I(V2^2)

)

# run them all in a loop, then order by AIC
selection <- purrr::map_df(formulas, ~{
  mod <- glm(.x, data= df, family="binomial")
  data.frame(formula = format(.x), 
             AIC = round(AIC(mod),2), 
             BIC = round(BIC(mod),2),
             R2adj = round(DescTools::PseudoR2(mod,which=c("McFaddenAdj")),3)
  )
})

warnings()

warnings()
# this returns a bunch of warnings about coercing the formulas into vectors, ignore those.
# however, this also lists the following for a handful of the models:
# "glm.fit: fitted probabilities numerically 0 or 1 occurred"
# which means perfect separation, but I'm not sure if this is a totally bad thing
# or not, as perfect separation actually pretty much does exist in the real data


# then we arrange by AIC and get our winning model:
selection %>% arrange(desc(AIC))

因此,使用该技术,我们发现最好的两个模型是response ~ V1 + V2 + I(V2^2) + V4response ~ V1 + V2 + I(V2^2)。但是,当我们一次一个地运行它们时,我们得到了两个模型的numerically 1 or 0误差,并且我们看到,在最佳模型中,唯一的区别(添加的V4)本身在统计上并不显著。所以..。我们使用哪一个??

代码语言:javascript
运行
AI代码解释
复制
bestmod1 <- glm(response ~ V1 + V2 + I(V2^2) + V4,
                family="binomial",
                data=df)
summary(bestmod1)$coefficients

bestmod2 <- glm(response ~ V1 + V2 + I(V2^2),
                family="binomial",
                data=df)
summary(bestmod2)$coefficients

方法2: GAMs

这里的技术类似,列出所有公式并在循环中运行。

代码语言:javascript
运行
AI代码解释
复制
library(mgcv)
gam_formulas <- list( # ind. main effects,
  response ~ s(V1),
  response ~ s(V2),
  response ~ s(V3),
  response ~ s(V4),

  # two variables
  response ~ s(V1) + s(V2),
  response ~ s(V1) + s(V3),
  response ~ s(V1) + s(V4),
  response ~ s(V2) + s(V3),
  response ~ s(V2) + s(V4),

  # three variables
  response ~ s(V1) + s(V2) + s(V3),
  response ~ s(V1) + s(V2) + s(V4),

  # add interactions
  response ~ te(V1, V2),
  response ~ te(V1, V2) + s(V3),
  response ~ te(V1, V2) + s(V4),
  response ~ te(V1, V3),
  response ~ te(V1, V3) + s(V2),
  response ~ te(V1, V4),
  response ~ te(V1, V4) + s(V2),                  
  response ~ te(V2, V3),
  response ~ te(V2, V3) + s(V1),
  response ~ te(V2, V4),
  response ~ te(V2, V4) + s(V1), 
  response ~ te(V2, by=V1),
  response ~ te(V1, by=V2),
  response ~ te(V2, by=V3),

  # two interactions?
  response ~ te(V1, V3) + te(V1, V2),
  response ~ te(V1, V4) + te(V1, V2),
  response ~ te(V2, V3) + te(V1, V2),
  response ~ te(V2, V4) + te(V1, V2)
)

gam_selection <- purrr::map_df(gam_formulas, ~{
  gam <- gam(.x, 
             data= df,  # always use same df
             family="binomial",
             method="REML")  # always use REML smoothing method
  data.frame(cbind(formula = as.character(list(formula(.x))),
                   round(broom::glance(gam),2),
                   R2 = summary(gam)$r.sq
  ))
})

# similarly, this gives a bunch of warnings about coercing the formulas into characters, 
# but also this, for a handful of the models, which I am guessing is an overfitting thing:
#  In newton(lsp = lsp, X = G$X, y = G$y, Eb = G$Eb, UrS = G$UrS,  ... :
#  Fitting terminated with step failure - check results carefully


gam_selection %>% arrange(desc(AIC))

但这返回了一堆奇怪的东西,因为许多模型(甚至不一定有类似的公式或AIC值)表明R2 = 1.00,而且从生物学上讲,这些公式没有太大的意义。为什么会发生这种情况?我该怎么做呢?(我知道这与使用"REML“有关,因为其中一些错误会在没有该行的情况下消失)。根据AIC值,我认为它实际上最准确的是从最好的第三:response ~ te(V2, by = V1),使用V2作为平滑变量,使用V1作为线性变量。

此外,根据AIC的说法,当更仔细地查看前两个gam时,没有一个变量本身是显着的(p值=1。奇怪),这让我觉得我不应该使用这些。

代码语言:javascript
运行
AI代码解释
复制
bestgam <- gam(response ~ s(V1) + s(V2) + s(V4), 
               data= df,  # always use same df
               family="binomial",
               method="REML")
summary(bestgam)
bestgam2 <- gam(response ~ s(V1) + s(V2) + s(V3), 
               data= df,  # always use same df
               family="binomial",
               method="REML")
summary(bestgam2)
bestgam3 <- gam(response ~ te(V2, by = V1), 
                data= df,  # always use same df
                family="binomial",
                method="REML")
summary(bestgam3) # this is the one I think I should be using

基本上,我不知道为什么我会使用GAM而不是GLM,或者反之亦然,那么如何在这个过程中选择变量并避免过度拟合。任何建议都很感谢。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-05-14 11:22:47

如果您认为因变量和自变量之间存在非线性关系,则可以使用GAM。

对于模型选择,您可以将收缩率添加到模型中的平滑器,以便在不需要它们的情况下可以将它们惩罚出模型。

  1. 更改您可能想要收缩的任何s()函数的基本类型。例如,如果使用薄板回归样条,则添加bs = 'ts';如果使用三次回归样条,则添加bs = 'cs'

在调用gam()时指定

  1. select = TRUE

关于这是如何工作的,以及这两种方法之间的区别,在这个答案中有更多的细节:https://stats.stackexchange.com/questions/405129/model-selection-for-gam-in-r

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61014113

复制
相关文章
R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类
这里唯一的问题是权重Δold是未知β的函数。但是实际上,如果我们继续迭代,我们应该能够解决它:给定β,我们得到了权重,并且有了权重,我们可以使用加权的OLS来获取更新的β。这就是迭代最小二乘的想法。
拓端
2021/03/16
1.5K0
R语言机器学习实战之多项式回归|附代码数据
一个简单的方法就是将每一个特征的幂次方添加为一个新的特征,然后在这个拓展的特征集上进行线性拟合,这种方法成为多项式回归。
拓端
2023/02/24
1.4K0
多元线性回归模型
设Y是一个可观测的随机变量,它受到p-1个非随机因素 X1、X2、X3···X(p-1)和随机因素ε的影响。 若Y与 X1、X2、X3···X(p-1)有如下线性关系:
看、未来
2020/08/26
2.7K0
多元线性回归模型
多元回归模型
回归模型 1 基本知识介绍 1.1回归模型的引入 由于客观事物内部规律的复杂性及人们认识程度的限制,无法分析实际对象内在的因果关系,建立合乎机理规律的数学模型。所以在遇到有些无法用机理分析建立数学模型
Angel_Kitty
2018/04/08
1.6K0
多元回归模型
多元线性回归的模型解释、假设检验、特征选择
线性回归是最流行和讨论最多的模型之一,它无疑是深入机器学习(ML)的入门之路。这种简单、直接的建模方法值得学习,这是进入ML的第一步。
deephub
2020/05/28
2.2K0
R语言逐步多元回归模型分析长鼻鱼密度影响因素
我从马里兰州生物流调查中提取了一些数据,以进行多元回归分析。数据因变量是每75米长的水流中长鼻鱼(Rhinichthys cataractae)的数量。自变量是河流流失的面积(英亩);氧浓度(毫克/升);水流段的最大深度(以厘米为单位);硝酸盐浓度(毫克/升);硫酸盐浓度(毫克/升);以及采样日期的水温(以摄氏度为单位)。
拓端
2023/08/31
2540
R语言逐步多元回归模型分析长鼻鱼密度影响因素
Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化|附代码数据
本文选自《Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化》。
拓端
2023/01/29
8940
R语言广义相加模型 (GAMs)分析预测CO2时间序列数据|附代码数据
最近我们被客户要求撰写关于广义相加模型 (GAMs)的研究报告,包括一些图形和统计输出。
拓端
2023/02/23
1.1K0
R语言广义线性模型(GLM)广义相加模型(GAM):多元平滑回归分析保险投资风险敞口
我不能在广义线性模型中使用双变量样条,但是考虑到广义可加模型(现在绝对不是可加模型),它确实可以工作。更准确地说,投资组合的分布是这两个协变量的函数,如下所示
拓端
2020/08/05
2.4K0
python实现logistic增长模型、多项式模型
比如一个人可以传染三个人,三个人传染九个人,九个人传染27个人,不停的倍增。这就是J型增长,也叫指数型的增长。
悟乙己
2022/11/30
2.2K0
python实现logistic增长模型、多项式模型
数据分享|逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化|附代码数据
世界卫生组织估计全世界每年有 1200 万人死于心脏病。在美国和其他发达国家,一半的死亡是由于心血管疾病
拓端
2023/02/09
1.1K0
R语言广义相加模型 (GAMs)分析预测CO2时间序列数据|附代码数据
最近我们被客户要求撰写关于广义相加模型 (GAMs)的研究报告,包括一些图形和统计输出。
拓端
2023/02/23
1K0
Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化|附代码数据
本文选自《Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化》。
拓端
2023/02/08
1.1K0
Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化|附代码数据
最近我们被客户要求撰写关于时间序列进行聚类研究报告,包括一些图形和统计输出。 时序数据的聚类方法,该算法按照以下流程执行。
拓端
2022/12/12
1.1K0
数据分享|逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化|附代码数据
世界卫生组织估计全世界每年有 1200 万人死于心脏病。在美国和其他发达国家,一半的死亡是由于心血管疾病
拓端
2023/01/11
1.2K0
我眼中的多元回归模型
模型自变量增加后,即便使用聚类等手段进行变量压缩,也不能将自变量的相关性完全剔除,这便会导致具有相关性的自变量溜进模型。由于自变量间关系不同,建模所选择的策略也会不同,模型的结果相对也会有较大差异,SAS中一般会使用selection参数进行变量控制,这个参数即为变量选择提供准则与方法。
许卉
2019/07/15
1.2K0
我眼中的多元回归模型
R语言广义相加模型 (GAMs)分析预测CO2时间序列数据|附代码数据
这基本上就是具有 光滑函数的广义线性模型(GLM)的扩展 。当然,当您使用光滑项拟合模型时,可能会发生许多复杂的事情,但是您只需要了解基本原理即可。
拓端
2022/12/21
1.3K0
R语言广义相加模型 (GAMs)分析预测CO2时间序列数据|附代码数据
这基本上就是具有 光滑函数的广义线性模型(GLM)的扩展 。当然,当您使用光滑项拟合模型时,可能会发生许多复杂的事情,但是您只需要了解基本原理即可。
拓端
2022/11/09
2K0
【视频】广义相加模型(GAM)在电力负荷预测中的应用|附代码数据
最近我们被客户要求撰写关于广义相加模型(GAM)的研究报告,包括一些图形和统计输出。
拓端
2023/03/24
1.3K0
理解回归分析--机器学习与R语言实战笔记(第四章)
回归是一种有监督的学习方式,用于建模分析一个独立变量(响应变量)和一个或多个非独立变量(预测变量)之间的关联。
用户1075469
2021/12/18
9950
理解回归分析--机器学习与R语言实战笔记(第四章)

相似问题

ordisurf vs mgcv:gam模型

10

多元logistic回归r?

11

如何比较gam模型和gamm模型?(mgcv)

12

在多项GAM (mgcv)中使用权重

12

多项Logistic回归利用模型系数和截尾得到概率

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档