拆分混合模型拟合独立线性模型时lm报0 non-NA cases错误如何解决
问题根因
你遇到的Error in lm.fit ... 0 (non-NA) cases报错是因为拟合线性模型的数据集Train.Sample.Steeper中,因变量trainSteepOutput全部为NA值,lm()函数要求至少存在1组同时不缺失自变量、因变量的观测才能完成拟合。
结合你贴出的运行结果,还有两个逻辑问题需要修正:
- 你仅初始化了全NA的训练集输出列,没有把原始数据集的
Output值赋值到对应训练集的输出列中 - 你计划筛选
Input >=5的样本,但从你给出的前6行数据看,Input最大值仅为2.009,没有符合阈值的样本,训练集实际为空
可行解决方案
步骤1:直接按规则拆分生成有效训练集
不需要提前创建全NA的空数据表,直接根据你的拆分规则从原始数据中提取对应样本即可,示例代码如下:
# 先根据你的实际业务规则调整拆分阈值,若Input为标准化后的数据可适当调低阈值 split_threshold <- 1 # 你原计划用的阈值为5,可根据全量数据的Input分布调整 # 拆分steeper组训练集:Input >= 阈值的样本 Train.Sample.Steeper <- data[data$Input >= split_threshold, c("Input", "Output")] colnames(Train.Sample.Steeper) <- c("trainSteepInput", "trainSteepOutput") # 拆分flatter组训练集:Input < 阈值的样本 Train.Sample.Flatter <- data[data$Input < split_threshold, c("Input", "Output")] colnames(Train.Sample.Flatter) <- c("trainFlatInput", "trainFlatOutput")
步骤2:拟合前校验训练集有效性
执行以下代码确认训练集符合拟合要求:
# 确认两组样本量均≥2(线性回归至少需要2个有效观测才能拟合) nrow(Train.Sample.Steeper) nrow(Train.Sample.Flatter) # 确认训练集无全量缺失值 sum(is.na(Train.Sample.Steeper)) sum(is.na(Train.Sample.Flatter))
步骤3:拟合线性模型
校验通过后执行拟合代码即可正常运行:
# 拟合steeper组线性模型 Train.Sample.Steep.lm <- lm(trainSteepOutput ~ trainSteepInput, data = Train.Sample.Steeper) # 拟合flatter组线性模型 Train.Sample.Flat.lm <- lm(trainFlatOutput ~ trainFlatInput, data = Train.Sample.Flatter)
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

