如何解决R语言模拟中出现的'colnames'赋值错误?
修复regsubsets报错:attempt to set 'colnames' on an object with less than two dimensions
错误原因
你的代码核心问题是自变量仅1个(X),但设置了nvmax=10。regsubsets尝试生成最多包含10个变量的模型,但数据中没有足够的自变量可选,导致summary(fit)返回的统计量(cp、bic、adjr2)是长度为1的向量,后续数据处理时触发了维度不匹配的列名设置错误。
两种修复方案
方案1:生成多自变量数据集(适配变量选择实验需求)
如果你的实验需要测试多变量场景的选择准则,修改数据生成逻辑,加入多个独立自变量:
set.seed(1) # 生成5个独立自变量 X <- matrix(rnorm(100*5), ncol=5) noise <- rnorm(100) # Y与前3个X变量建立线性关系 Y <- 3 + 1*X[,1] + 4*X[,2] + 6*X[,3] + noise require(leaps) df <- data.frame(Y, X) # nvmax设置为自变量总数(5),匹配可选变量数量 fit <- regsubsets(Y~., data = df, nvmax = 5)
方案2:调整nvmax匹配单变量场景
如果仅需要单变量测试,把nvmax设置为1,和自变量数量保持一致:
fit <- regsubsets(Y~X, data = df, nvmax = 1)
完整修复后代码(多变量场景)
set.seed(1) X <- matrix(rnorm(100*5), ncol=5) noise <- rnorm(100) Y <- 3 + 1*X[,1] + 4*X[,2] + 6*X[,3] + noise require(leaps) df <- data.frame(Y, X) fit <- regsubsets(Y~., data = df, nvmax = 5) fit_summary <- summary(fit) require(tidyverse);require(ggplot2);require(ggthemes); data_frame(Cp = fit_summary$cp, BIC = fit_summary$bic, AdjR2 = fit_summary$adjr2) %>% mutate(id = row_number()) %>% gather(value_type, value, -id) %>% ggplot(aes(id, value, col = value_type)) + geom_line() + geom_point() + ylab('') + xlab('Number of Variables Used') + facet_wrap(~ value_type, scales = 'free') + theme_tufte() + scale_x_continuous(breaks = 1:5)
额外说明
- 多变量场景下,
regsubsets会生成从1到nvmax个变量的所有可能模型,summary(fit)返回的统计量长度与nvmax一致,后续数据处理和绘图可正常运行。 - 单变量场景下,
nvmax=1时,需把绘图代码中的scale_x_continuous(breaks = 1:10)改为breaks=1,才能匹配数据维度。
内容的提问来源于stack exchange,提问作者Mere J
相关产品推荐
相关产品推荐

