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

如何检测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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:53:11