如何在R中构建线性与逻辑回归模型 解决连帽衫尺码预测lm报错问题
报错根本原因
- 你构建数据集时使用
cbind(hoodie, data),由于hoodie是字符向量,R会强制将返回结果转为字符矩阵,所有字段(包括weight、shoe_size)都变成字符类型,后续转数值、因子时会出现大量NA lm()要求响应变量为数值型,你直接传入字符串类型的尺码字段,R强制转换失败就会触发NA/NaN/Inf in 'y'报错
第一步:修正数据集构建逻辑
不要用cbind拼接,直接在原数据框新增列,保留所有字段原始类型:
data <- data.frame(height=c(184,163,170,161,162,167,180,175,182,176,180,164,178,155,187,176,176,152,160,190), weight=c(83,51,80,53,64,70,75,74,86,78,90,66,60,44,81,75,68,63,51,88), shoe_size=c(44,37,42,35,38,40,43,42,44,43,45,40,40,35,44,40,42,39,36,45), age=c(26,24,26,26,25,28,28,24,31,25,29,24,38,27,28,32,26,33,26,26)) # 直接新增hoodie列,不需要cbind data$hoodie <- with(data, ifelse(weight<=45, "XXS", ifelse(weight>45 & weight<=52, "XS", ifelse(weight>52 & weight<=57, "S", ifelse(weight>57 & weight<=64, "M", ifelse(weight>64 & weight<=75, "L", "XL"))))))
第二步:处理响应变量格式
连帽衫尺码是有序分类变量,需要先指定顺序转为有序因子,再按需映射为数值:
# 指定尺码顺序,转为有序因子,不会产生NA data$hoodie <- factor(data$hoodie, levels = c("XXS", "XS", "S", "M", "L", "XL"), ordered = TRUE) # 如果构建线性回归,需要映射为连续数值(1对应XXS,6对应XL) data$hoodie_num <- as.numeric(data$hoodie)
第三步:构建模型
3.1 线性回归模型
使用映射后的数值型响应变量建模:
linear_model <- lm(hoodie_num ~ weight + shoe_size, data = data) summary(linear_model) # 预测函数,将数值预测结果转回尺码标签 predict_linear <- function(model, newdata) { pred_num <- round(predict(model, newdata = newdata)) # 限制预测值范围,避免超出尺码等级 pred_num <- pmax(pmin(pred_num, 6), 1) return(levels(data$hoodie)[pred_num]) } # 测试预测 test_df <- data.frame(weight = c(48, 62, 82), shoe_size = c(36, 40, 44)) predict_linear(linear_model, test_df)
3.2 有序逻辑回归模型
由于尺码是有序分类,使用有序逻辑回归比线性回归更贴合业务场景,用MASS包的polr函数实现:
library(MASS) ord_logit_model <- polr(hoodie ~ weight + shoe_size, data = data, Hess = TRUE) summary(ord_logit_model) # 直接预测得到尺码标签 predict(ord_logit_model, newdata = test_df)
3.3 无序多分类逻辑回归
如果不考虑尺码顺序,用nnet包的multinom函数实现:
library(nnet) multi_logit_model <- multinom(hoodie ~ weight + shoe_size, data = data) summary(multi_logit_model) # 预测 predict(multi_logit_model, newdata = test_df)
内容的提问来源于stack exchange,提问作者coder_bg
相关产品推荐
相关产品推荐

