使用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
相关产品推荐
相关产品推荐

