如何检测R中独特值≤3的列以排除于GAM样条分析
解决GAM样条分析中"独特值不足4个"的报错与列筛选方法
1. 检测数据中独特值数量≤3的列
针对Boston Housing数据集,先加载数据,再计算每列的独特值数量并筛选目标列:
Base R 实现
library(MASS) data(Boston) # 计算每列的独特值数量 unique_counts <- sapply(Boston, function(col) length(unique(col))) # 筛选出独特值≤3的列名 low_unique_cols <- names(unique_counts[unique_counts <= 3]) print(low_unique_cols) # 输出会包含chas这类列
tidyverse 实现(适合dplyr用户)
library(MASS) library(dplyr) data(Boston) low_unique_cols <- Boston %>% summarise(across(everything(), ~length(unique(.)))) %>% tidyr::gather(key = "col_name", value = "unique_count") %>% filter(unique_count <= 3) %>% pull(col_name)
2. 排除低独特值列后运行GAM分析
筛选出符合要求的变量后,构建模型数据并运行样条分析:
library(gam) # 排除低独特值列 gam_data <- Boston[, !names(Boston) %in% low_unique_cols] # 自动构建GAM公式(避免手动罗列变量) predictors <- setdiff(names(gam_data), "medv") # 排除因变量medv formula <- as.formula(paste("medv ~", paste(paste0("s(", predictors, ")"), collapse = " + "))) # 拟合模型 gam_model <- gam(formula, data = gam_data) # 查看模型结果 summary(gam_model)
3. 额外处理方案:保留分类变量作为线性项
如果不想完全排除像chas这类二元变量,可以将其作为普通线性项加入模型,而非平滑项:
# 手动指定公式,chas用线性项,其他变量用平滑项 gam_model_with_chas <- gam( medv ~ chas + s(crim) + s(zn) + s(indus) + s(nox) + s(rm) + s(age) + s(dis) + s(rad) + s(tax) + s(ptratio) + s(black) + s(lstat), data = Boston )
内容的提问来源于stack exchange,提问作者Russ Conte
相关产品推荐
相关产品推荐

