You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mgcv包进行GAM分析的三类问题:维度、分类变量与VIF

使用mgcv包进行GAM分析的三类问题

我正在使用mgcv包进行GAM分析,数据集包含180行44列:1个数值型因变量、2个0/1数值型分类自变量、41个数值型自变量,所有变量均已中心化和标准化。分析过程中遇到以下问题:

问题1:自变量数量≥24时模型报错

我采用从多到少的方式选择自变量(从全部43个自变量逐步减少到2个),当自变量数量为24及以上时,出现如下错误:

> for (i in 2:ncol(mydata)){
    variable__ <- c(variable__, variable_[i])}
> variable__ 
[1] "s(age)"       "s(wdstd_b_d)" "s(spo_b_d)"
> formula_ <- reformulate(termlabels = variable__, response = 'y')
> models[[THs]] <- try(gam(formula_ , data = as.data.frame(mydata)))
> variable__ <- c()
> formula_
y ~ s(age) + s(wdstd_b_d) + s(spo_b_d)

错误信息:

Error in gam(function, data = as.data.frame(mydata)) : Model has more coefficients than data

自变量数量为22及以下时模型运行正常(实际样本量为184行),已确认公式与数据框变量数量一致,怀疑是GAM的统计特性导致该问题。

问题2:VIF检测多重共线性时异常

使用VIF检测多重共线性时,出现两种异常情况:

  • 不含分类变量的模型:car:::vif返回GVIF为Inf,mgcv.helper::vif.gam返回空结果
    > model_1 <- gam(formula_, data = as.data.frame(mydata))
    > car:::vif(model_1)
    |          |       GVIF  |Df  |GVIF^(1/(2*Df))|
    |----------|-------------|----|---------------|
    |age       |72791236433  |0   |          Inf  |
    |wdstd_b_d |72791236433  |0   |          Inf  |
    |spo_b_d   |72791236433  |0   |          Inf  |
    
    > mgcv.helper::vif.gam(model_1)
    A tibble: 0 x 1
    ... with 1 variable: vif <dbl>
    
  • 含分类变量的模型:直接报错
    Error in apply(X = X[, selected_col], MARGIN = 2, var) : 
      dim(X) must have a positive length
    

此前用lm处理同格式的分类变量和VIF时无问题,目前无法解决该异常。

问题3:分类变量转因子后,mgcv.helper::vif.gam仍报错

按照建议将分类变量转为因子后,运行mgcv.helper::vif.gam仍报错:

Error in `[.data.frame`(X, , selected_col) : undefined columns selected

经排查,原因是因子化后的分类变量(如postpref)在模型摘要中显示为postpref1.18228915156431(后缀为标准化后的1值),导致函数无法找到对应变量。


内容的提问来源于stack exchange,提问作者Roger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:07:09