首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多项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

复制
相关文章
Tcp连接建立与连接释放
1)客户端给服务器发送了一条将其SYN标志位置1的请求连接建立报文,然后其状态由closed转变为SYN-SENT(同步已发送)。
你的益达
2020/08/25
3.8K0
Tcp连接建立与连接释放
建立JDBC数据库连接实例解析
  连接(Connection)是一个代表与数据库进行的程序连接的对象。通过连接,可以执行SQL语句、返回数据库操作结果等。 创建指定数据库的URL     要建立与数据库的连接,首先要创建指定数据库的URL。连接通常是通过数据库的URL对象,利用DriverManager的getConnection方法建立的。数据库URL对象与网络资源的统一资源定位类似,其构成格式如下:    jdbc:subProtocol:subName://hostname:port; DatabaseName=XXX  
阿新
2018/04/11
2.2K0
如何与 Zappos 建立 EDI 连接?
Zappos 是一家享誉全球的知名在线鞋类和服饰零售商,经营范围涵盖各类时尚品牌的鞋类、服饰及配饰等,使命是为广大消费者提供方便、愉悦、优质的购物体验,让每一位顾客都能找到心仪的产品。多年来,Zappos 卖场凭借卓越的服务与产品质量,积累了众多荣誉和成就。
知行软件EDI
2023/07/28
2520
如何与 Zappos 建立 EDI 连接?
如何与 MACOM 建立 EDI 连接?
MACOM提供高性能射频,微波和毫米波器件,其产品广泛应用于通信,航空航天,国防和工业市场。近年来MACOM在中国地区的业务一直高速增长。
知行软件EDI
2023/04/17
1.3K0
如何与 MACOM 建立 EDI 连接?
如何与GHSP 建立 EDI 连接?
GHSP是全球领先的汽车、运输和电器行业机械和机电系统供应商。最初成立于1924年,此后已扩展到世界各地。如果GHSP向我们发来EDI连接邀请,我们应该如何应对呢?
知行软件EDI
2022/10/31
1.3K0
如何与GHSP 建立 EDI 连接?
如何与Kostal 建立EDI连接?
Kostal是一家德国公司,主要从事汽车电子和工业电子产品的研发、生产和销售,是全球领先的电子元器件和系统供应商之一。其产品包括电气系统、传感器、电动驱动系统、电池管理系统等方面,被广泛应用于汽车、工业、家用电器等领域。
知行软件EDI
2023/05/09
6220
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
星哥玩云
2022/08/16
5.7K0
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
速读原著-TCP/IP(连接的建立与终止)
T C P是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将详细讨论一个 T C P连接是如何建立的以及通信结束后是如何终止的。这种两端间连接的建立与无连接协议如 U D P不同。我们在第 11章看到一端使用 U D P向另一端发送数据报时,无需任何预先的握手。
cwl_java
2020/03/11
5480
如何与宜家IKEA建立EDI连接?
宜家IKEA是来自瑞典的全球知名家具和家居零售商,在全球拥有223个商场,其中有36家商场位于中国大陆。如今宜家在全球53个国家有大约1300个供应商,在16个国家的28个分销中心负责为宜家商场供货。如此庞大的供应链体系和业务数据量使得宜家的业务数据处理流程面临巨大挑战。究竟如何处理大批量的业务数据呢?答案是:使用EDI(电子数据交换)技术。EDI专攻于大批量的业务数据处理,助力宜家提升其自动化水平。
知行软件EDI
2021/05/24
9630
如何与宜家IKEA建立EDI连接?
Linux下与github建立ssh连接
3.当你看到 “Enter a file in which to save the key,” 的提示后,按Enter键.意思就是使用默认路径.
LogicPanda
2018/08/30
6.8K0
Linux下与github建立ssh连接
Linux下与github建立ssh连接
前期准备 设置用户: git config --global user.name "your name" git config --globa user.email "your email.com" 全局使用该用户名及用户邮箱 创建目录: mkdir new_folder_name 创建一个用于跟踪的新文件夹或者使用系统自带的文件管理系统创建一个新的文件夹 可以参看 git常用命令及含义[http://blog.csdn.net/autuan_liu/article/details/5
zenRRan
2018/04/10
6.5K0
Linux下与github建立ssh连接
浅谈TCP协议(建立与断开连接)
TCP是面向连接的,可靠的进程到进程通信的协议。 TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存,用来临时存储数据。 TCP将若干个字节构成一个分组,成为报文段(segment) TCP报文段封装在IP数据报中:
小手冰凉
2019/09/10
2.7K0
浅谈TCP协议(建立与断开连接)
如何与 Boot Barn 建立 EDI 连接?
Boot Barn 大力鼓励其供应商使用 EDI,计划与其供应商一起使用 EDI 技术,从而转换采购订单、发票和提前发货通知 (ASN) 的人工处理方式。
知行软件EDI
2023/08/04
2550
如何与 Boot Barn 建立 EDI 连接?
MariaDB 建立连接
上面给出的代码连接到MariaDB并提供一个命令提示符来执行SQL命令。 输入代码后,将显示一条欢迎消息,指示连接成功,并显示版本号。
用户9042463
2021/09/29
1.7K0
建立技术连接的思维
从工作计划的角度来说,我们是罗列出一些工作的清单,标明任务权重,当然从我们的角度来说,我们更多会从系统,技术的角度来进行描述和权衡。
jeanron100
2019/05/13
7650
Mysql连接建立与thread cache唤醒原理
Thread 1 监听socket,协议栈的连接上来后,使用现有的或新建线程处理连接。
mingjie
2022/05/12
1.1K0
一、Django连接与建立数据库
如果没有修改django默认数据库连接,那么会自动生产一个sqlite3的数据库。
Dreamy.TZK
2020/04/09
2.8K0
如何与劳氏 Lowe's 建立EDI连接?
劳氏Lowe's(以下简称:Lowe's)是专门从事家庭装修的美国零售公司,而 EDI 则是电子数据交换的缩写,是指通过计算机网络进行企业间电子数据交换的一种标准化方式。
知行软件EDI
2023/05/10
3690
如何与劳氏 Lowe's 建立EDI连接?
【说站】python中socket建立客户连接
以上就是python中socket建立客户连接的方法,希望对大家有所帮助。更多Python学习指路:python基础教程
很酷的站长
2022/11/23
5380
【说站】python中socket建立客户连接
如何与安森美Onsemi建立EDI连接?
安森美半导体(ON Semiconductor)是应用于高能效电子产品的首要高性能硅方案供应商。其产品包括电源和信号管理、逻辑、分立及定制器件,帮助客户解决他们在汽车、通信、计算机、消费电子等领域的独特设计挑战。近期我们帮助客户成功与安森美Onsemi建立EDI连接,实现自动化地业务数据传输。
知行软件EDI
2022/10/25
5050
如何与安森美Onsemi建立EDI连接?

相似问题

当大小文件较大时,$_FILE为空,代码点火器

12

当字段为空时,验证无效

10

当字段为空时删除行

15

当字段为空时获取"null“

15

当字段为空时触发变更

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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