You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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折交叉验证要求,导致报错。

  • 具体解决步骤:

    1. 确认有效样本量:先运行以下代码,查看去掉所有含缺失值的样本后剩余的观测数:
      nrow(na.omit(master))
      
    2. 调整交叉验证参数:
      • 如果有效样本量极小(比如<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)
        
    3. 优化变量处理:你的Pk_变量存在大量互斥缺失(同一行仅少数变量有值),可以考虑:
      • 对同类峰值变量进行整合,比如将同一波段的峰值合并为一个变量;
      • 筛选非缺失率较高的变量,减少冗余和缺失带来的模型不稳定问题。

内容的提问来源于stack exchange,提问作者Moirajm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:29:50