内核回归导致不同的输出

数据挖掘 r 预测建模 回归
2022-02-16 18:56:35

我正在使用内核回归来构建预测模型。同样,我正在使用np包。它工作正常,但我在多次运行相同的数据时观察到,它会产生不同的结果。为什么它会在相同数据上产生不同的输出?有没有办法选择模型的最佳运行?这是最小的R代码:

library(np)
   bw.all = npregbw(formula=power ~ temperature  
                                  + prevday1 + prevday2
                                  + prev_instant1 + prev_instant2 
                                  + prev_2_hour,
                regtype="ll",bwmethod="cv.aic", data=new_tr_dat)
   model.np <- npreg(bws=bw.all)
   summary(model.np) 

我正在使用以下数据进行实验:

        power temperature   prevday1   prevday2 prev_instant1 prev_instant2 prev_2_hour
1   220.59680          38         NA         NA      648.3621     1392.2186    848.7299
2   584.06867          38  220.59680         NA     1012.6853      250.1150    434.7129
3   206.39849          40  584.06867  220.59680      169.9380      105.5796    127.7294
4   177.05559          39  206.39849  584.06867      167.6312      229.3927    249.9871
5   165.71996          41  177.05559  206.39849      214.8291      248.5378    247.0262
6   184.02724          44  165.71996  177.05559      256.9970      314.3742    485.5184
7   187.70557          43  184.02724  165.71996      125.6160      213.9993    174.0830
8   916.78484          43  187.70557  184.02724      668.2840      217.3451    423.8285
9   185.98017          42  916.78484  187.70557      295.7329      331.6580   1227.0293
10  490.42294          42  185.98017  916.78484      241.6590      249.0523    255.3110
11  703.92694          39  490.42294  185.98017      806.5259     1515.1619   1140.4415
12 2038.91747          37  703.92694  490.42294      232.5541      582.5105    632.7118
13  208.66049          26 2038.91747  703.92694      210.5353      217.5053    221.3938
14  281.89860          37  208.66049 2038.91747      796.4336      256.4664    603.0781
15  425.72868          32  281.89860  208.66049      250.6069      187.1751    260.0573
16   86.77193          36  425.72868  281.89860      174.1249      179.6437    164.4359
17  218.06322          39   86.77193  425.72868      223.6548      316.2230    322.8536
18  258.89159          43  218.06322   86.77193      233.4561      372.5123    256.8588
19 1436.19980          40  258.89159  218.06322     1266.2630     1387.2287    791.7056
20  261.68520          42 1436.19980  258.89159      278.3378      230.5614    262.0084
21  225.34517          44  261.68520 1436.19980      211.3332      147.6705    196.8328
22  852.68835          44  225.34517  261.68520     1271.5826     1233.7158    991.7835
23 1729.79826          44  852.68835  225.34517      945.6528      298.0929    412.2199
24  464.58053          43 1729.79826  852.68835      182.6507      184.3031    203.5395
25  902.30950          45  464.58053 1729.79826      308.1398     1743.3495    642.4563
26  428.18792          45  902.30950  464.58053      205.1806      697.9208   1434.5425
27 1508.74739          43  428.18792  902.30950     1371.0550     2165.7173   1918.5236
28  355.01704          42 1508.74739  428.18792     1750.3907     1740.4654   1022.5056
29 3248.62618          43  355.01704 1508.74739      686.8528      360.0539    660.6378
30 1949.63937          44 3248.62618  355.01704      258.4627      217.2683    232.3818
31  725.25368          40 1949.63937 3248.62618     1406.3282     1714.6412   1375.2824
32  261.31252          32  725.25368 1949.63937      553.0443      275.6697    409.9598
1个回答

您有非常少量的观察值(32 个?)和大量的预测变量。

众所周知,交叉验证函数具有多个局部最小值/最大值。如果您将多启动的数量增加到例如 nmulti=100(将此选项添加到您对 npregbw() 的调用中),您应该会看到每次调用优化过程都会出现相同的结果。

请注意,您可以在调用 npreg() 时完成所有这些操作,并为方便起见跳过带宽调用(npreg() 将自动调用 npregbw(),但接受用于 npregbw() 的参数)。

此外,如果每次运行例程时重新启动 R,您将获得相同的结果(自动设置种子以确保这一点)。

model <- npreg(power ~ temperature  
                     + prevday1 
                     + prevday2
                     + prev_instant1 
                     + prev_instant2 
                     + prev_2_hour,
                regtype="ll",
                bwmethod="cv.aic", 
                nmulti=100,
                data=new_tr_dat)

要查看关于多启动数量是否稳定,请查看提供的交叉验证函数和摘要的值。此外,您可以通过 plot() 查看部分回归图以及重新采样的可变性界限。

summary(model$bws)
plot(model,common.scale=FALSE,plot.errors.method="bootstrap")

另外,我注意到您的预测器“温度”是离散的,因此您可以考虑使用

+ ordered(temperature)

(即使用离散的支持内核)。这样做表明该模型中几乎没有信号,但对于简单的参数模型也是如此(调整后的 r 平方为负)。

model.lm <- lm(model$bws$formula)
summary(model.lm)

希望这可以帮助!