R语言PLS模型报错:请求的分段数大于观测数
问题:PLS模型交叉验证报错"More segments than observations requested"
尝试用所有Pk_系列变量作为预测因子,BG_Activity作为响应变量构建PLS模型,探究峰值对BG活性的预测能力,使用的代码如下:
library(pls) head(master) fullmodel <- (plsr(BG_Activity ~ Pk_1030+Pk_1040+Pk_1050+Pk_1060+Pk_1150+ Pk_1160+Pk_1240+Pk_1260+Pk_1270+Pk_1370+Pk_1380+Pk_1420+ Pk_1430+Pk_1510+Pk_1610+Pk_1620+Pk_1640+Pk_1650+Pk_1730+ Pk_2850+Pk_2920+Pk_2930+Pk_3340+Pk_3350+Pk_3360+Pk_3370, data=master, scale=TRUE, validation="CV"))
展示的数据集前6行如下:
Sample_ID Trt Litter_Type Plot Pk_1030 Pk_1040 Pk_1050 Pk_1060 Pk_1150 Pk_1160 1 1-T-R-329 Trenched Red 1 0.991 NA NA 1.000 NA NA 2 1-T-W-258 Trenched White 1 NA 0.964 NA 0.984 NA NA 3 1-U-R-396 Control Red 1 0.768 NA NA 0.778 NA NA 4 1-U-W-262 Control White 1 0.919 NA NA 0.935 NA NA 5 10-T-R-307 Trenched Red 10 0.842 NA NA 0.848 NA NA 6 10-T-W-259 Trenched White 10 0.795 NA NA 0.808 NA NA Pk_1240 Pk_1260 Pk_1270 Pk_1370 Pk_1380 Pk_1420 Pk_1430 Pk_1510 Pk_1610 Pk_1620 Pk_1640 1 NA NA 0.631 NA 0.612 0.557 NA 0.499 0.697 NA NA 2 NA NA 0.649 NA 0.611 0.563 NA 0.536 0.792 NA NA 3 NA 0.527 NA NA 0.502 0.467 0.468 0.453 NA 0.720 NA 4 NA NA 0.619 NA NA 0.561 NA 0.536 NA 0.769 NA 5 NA NA 0.567 NA NA NA 0.521 0.499 NA 0.716 NA 6 NA NA 0.586 NA NA 0.540 NA 0.536 NA 0.801 NA Pk_1650 Pk_1730 Pk_2850 Pk_2920 Pk_2930 Pk_3340 Pk_3350 Pk_3360 Pk_3370 NAG_Activity 1 NA 0.484 0.479 NA 0.644 NA NA NA NA 1647.1900 2 NA 0.509 0.530 0.692 NA 1 NA NA NA 429.6296 3 NA 0.419 0.475 0.622 NA NA NA 0.997 1 1043.2552 4 NA 0.496 0.541 0.701 NA 1 NA NA NA 2480.3522 5 NA 0.436 0.519 0.665 NA NA 0.999 1.000 NA 2346.0038 6 NA 0.546 0.590 0.745 NA NA 0.997 0.999 1 1782.2075 BG_Activity LAP_Activity PX_Activity PropMassLost CNRatio 1 1664.240 65.1880 0.9910010 0.3555845 58.71084 2 1313.015 81.6370 1.3299610 0.3595539 53.60227 3 1744.150 195.2000 1.3199757 0.3889448 47.79798 4 2632.919 166.9087 0.0354808 0.3833724 52.45055 5 2880.120 193.5611 1.8477293 0.3146816 50.42553 6 1620.891 112.6189 0.5871686 0.3584839 55.27059
运行后出现以下错误:
Error in cvsegments(nobj, k = segments, type = segment.type) :
More segments than observations requested
解决方案
核心原因:默认交叉验证的折数(segments)大于有效观测数。你的
Pk_变量存在大量缺失值,去掉含NA的样本后剩余的有效观测数可能远小于plsr默认的10折交叉验证要求,导致报错。具体解决步骤:
- 确认有效样本量:先运行以下代码,查看去掉所有含缺失值的样本后剩余的观测数:
nrow(na.omit(master)) - 调整交叉验证参数:
- 如果有效样本量极小(比如<5),改用留一交叉验证(Leave-One-Out CV),将
validation参数设为"LOO":library(pls) fullmodel <- plsr(BG_Activity ~ Pk_1030+Pk_1040+Pk_1050+Pk_1060+Pk_1150+ Pk_1160+Pk_1240+Pk_1260+Pk_1270+Pk_1370+Pk_1380+Pk_1420+ Pk_1430+Pk_1510+Pk_1610+Pk_1620+Pk_1640+Pk_1650+Pk_1730+ Pk_2850+Pk_2920+Pk_2930+Pk_3340+Pk_3350+Pk_3360+Pk_3370, data=master, scale=TRUE, validation="LOO") - 如果有效样本量足够(比如≥6),设置
segments参数为小于等于有效样本数的折数,例如有效样本为8时设为6折:fullmodel <- plsr(BG_Activity ~ Pk_1030+Pk_1040+Pk_1050+Pk_1060+Pk_1150+ Pk_1160+Pk_1240+Pk_1260+Pk_1270+Pk_1370+Pk_1380+Pk_1420+ Pk_1430+Pk_1510+Pk_1610+Pk_1620+Pk_1640+Pk_1650+Pk_1730+ Pk_2850+Pk_2920+Pk_2930+Pk_3340+Pk_3350+Pk_3360+Pk_3370, data=master, scale=TRUE, validation="CV", segments=6)
- 如果有效样本量极小(比如<5),改用留一交叉验证(Leave-One-Out CV),将
- 优化变量处理:你的
Pk_变量存在大量互斥缺失(同一行仅少数变量有值),可以考虑:- 对同类峰值变量进行整合,比如将同一波段的峰值合并为一个变量;
- 筛选非缺失率较高的变量,减少冗余和缺失带来的模型不稳定问题。
- 确认有效样本量:先运行以下代码,查看去掉所有含缺失值的样本后剩余的观测数:
内容的提问来源于stack exchange,提问作者Moirajm
相关产品推荐
相关产品推荐

