R语言模型评估时table函数报错:参数长度不一致的解决
解决logistic回归中table函数的长度不匹配错误
错误原因
这个报错的核心是:你传入table()的两个向量eval$class和predict.status长度不一致,table函数要求所有输入参数的元素数量必须完全相同才能生成交叉频数表。
排查与解决步骤
先确认长度差异:运行以下代码查看两个对象的长度,明确差异来源:
length(eval$class) length(predict.status)检查预测对象的匹配性:
如果你划分了训练集和测试集,用训练集拟合模型后,必须对**测试集(eval)**做预测,才能和eval$class匹配。正确的预测代码应该是:predict.status <- predict(你的模型对象, newdata = eval, type = "class")要是这里的
newdata误写成训练集(training),predict.status的长度就会和训练集一致,自然和测试集的eval$class长度不匹配。处理缺失值:
biopsy数据集存在缺失值,若拟合模型前未处理,glm()会自动删除含NA的行,导致训练/测试集的实际行数和原划分的不一致。可以先清理数据:biopsy_clean <- na.omit(biopsy)再基于清理后的数据集划分训练集和测试集。
完整示例代码
# 加载内置数据集 data(biopsy) # 清理缺失值 biopsy_clean <- na.omit(biopsy) # 设置随机种子保证结果可复现 set.seed(123) # 7:3拆分训练集和测试集 train_rows <- sample(nrow(biopsy_clean), 0.7 * nrow(biopsy_clean)) training <- biopsy_clean[train_rows, ] eval <- biopsy_clean[-train_rows, ] # 拟合logistic回归模型 logit_model <- glm(class ~ ., data = training, family = binomial) # 对测试集预测类别 predict.status <- predict(logit_model, newdata = eval, type = "class") # 生成交叉表 ct <- table(eval$class, predict.status) # 查看结果 print(ct)
内容的提问来源于stack exchange,提问作者Luke Kasianiuk
相关产品推荐
相关产品推荐

