R逻辑回归计算标准化系数报Calling var(x) on a factor错误如何解决
报错根因
报错的核心原因是代码执行顺序错误:你在完成自变量类型转换、生成清洗后的subset数据集之前,就已经执行了训练集/测试集划分的代码,此时模型训练用的train数据集来自环境中遗留的旧subset,其中的自变量还是因子类型,导致后续计算标准差时调用var()函数触发了因子不支持的报错。
此外代码中还有两处笔误也会引发后续报错:
- 合并系数时写的
summary_coeff多了一个f,实际定义的变量名为summary_coef row.names(std.coff)-NULL中误用了减号,应该为赋值符号<-
修复步骤
1. 调整代码执行顺序
将训练集划分的代码块移动到数据集清洗、变量类型转换的代码之后,正确顺序如下:
# 先生成清洗后的subset数据集,完成所有变量类型转换 subset <- subset(completedData, select = -c(Loan_ID)) subset$Loan_Status <- as.factor(subset$Loan_Status) subset$Property_Area <- as.integer(as.factor(subset$Property_Area)) subset$CoapplicantIncome <- as.integer(subset$CoapplicantIncome) subset$Self_Employed <- as.numeric(as.factor(subset$Self_Employed)) subset$Education <- as.numeric(as.factor(subset$Education)) subset$Dependents <- as.numeric(as.factor(subset$Dependents)) subset$Married <- as.numeric(as.factor(subset$Married)) subset$Gender <- as.numeric(as.factor(subset$Gender)) # 转换完成后再划分训练集、测试集 set.seed(123) # 增加随机种子保证结果可复现 datasort <- sort(sample(nrow(subset),nrow(subset)*.75)) train <- subset[datasort,] test <- subset[-datasort,]
2. 优化标准化系数计算函数
调整stz.ciff函数,增加强制类型转换逻辑,避免残留因子引发报错:
stz.ciff <- function(logitmodel){ # 提取自变量系数(排除截距项) b <- summary(logitmodel)$coef[-1, 1] # 提取自变量数据集(排除第一列的因变量) x_vars <- logitmodel$model[, -1, drop = FALSE] # 强制将所有列转换为数值型,避免因子残留 x_vars <- as.data.frame(lapply(x_vars, function(col) { if(is.factor(col)) as.numeric(as.character(col)) else col })) # 计算各变量标准差 sx <- sapply(x_vars, sd, na.rm = TRUE) # 计算标准化系数 beta <- (sqrt(3)/pi) * sx * b return(beta) }
3. 修正笔误
将两处错误代码修改为:
# 原来的row.names(std.coff)-NULL改为 row.names(std.coff) <- NULL # 原来的merge(summary_coeff,std.coff,by="variable",all.x=TRUE)改为 final = merge(summary_coef,std.coff,by="variable",all.x=TRUE)
内容的提问来源于stack exchange,提问作者Mavezu94
相关产品推荐
相关产品推荐

