Resources

Variable Bandwidth Smoothing

/*--------------------------------------------------------------

                    SAS Sample Library

        Name: ssmex09.sas
 Description: Example program from SAS/ETS User's Guide,
              The SSM Procedure
       Title: Variable Bandwidth Smoothing
     Product: SAS/ETS Software
        Keys: state space model, variable bandwidth smoothing
        PROC: SSM
       Notes:

--------------------------------------------------------------*/

data difficult;
 input x y;
 datalines;
 0.002 0.040
 0.011 0.009
 0.013 0.719
 0.016 0.199
 0.017 -0.409
 0.019 0.410
 0.021 -0.242
 0.025 0.654
 0.031 0.407
 0.032 0.243
 0.033 -0.166
 0.040 0.880
 0.056 0.019
 0.056 -0.121
 0.058 -0.265
 0.059 -0.586
 0.063 0.452
 0.065 0.676
 0.076 -0.582
 0.077 0.263
 0.091 0.693
 0.094 -0.233
 0.119 0.497
 0.123 0.385
 0.133 -1.089
 0.140 0.443
 0.149 0.427
 0.151 0.404
 0.162 1.012
 0.171 -0.138
 0.176 0.072
 0.186 0.743
 0.191 0.877
 0.199 0.458
 0.201 0.959
 0.202 -0.030
 0.204 0.493
 0.205 0.586
 0.210 0.583
 0.216 0.018
 0.216 0.545
 0.216 0.089
 0.219 -0.310
 0.231 0.397
 0.233 0.429
 0.237 0.085
 0.238 0.752
 0.240 1.151
 0.244 -0.216
 0.256 0.028
 0.269 0.246
 0.274 0.670
 0.275 0.255
 0.282 0.998
 0.288 -0.031
 0.290 0.644
 0.296 0.053
 0.297 0.733
 0.300 0.718
 0.302 0.244
 0.310 0.478
 0.321 0.880
 0.324 -0.148
 0.340 0.776
 0.349 0.675
 0.367 0.883
 0.373 0.398
 0.373 0.748
 0.377 0.842
 0.381 0.831
 0.381 0.692
 0.394 0.438
 0.395 0.680
 0.401 0.468
 0.401 1.038
 0.409 1.222
 0.419 1.393
 0.431 0.654
 0.440 0.694
 0.442 0.745
 0.446 0.542
 0.449 0.894
 0.454 0.688
 0.468 0.302
 0.471 0.655
 0.471 0.724
 0.484 0.968
 0.485 1.063
 0.486 0.900
 0.488 1.088
 0.493 1.032
 0.493 0.833
 0.494 0.998
 0.496 0.667
 0.498 0.742
 0.504 0.810
 0.505 0.941
 0.506 0.487
 0.512 0.606
 0.516 0.673
 0.519 0.884
 0.522 0.773
 0.523 0.686
 0.531 0.910
 0.540 0.915
 0.542 0.619
 0.549 0.851
 0.562 0.554
 0.567 0.511
 0.573 0.745
 0.581 0.632
 0.584 0.244
 0.586 0.708
 0.589 0.461
 0.601 0.793
 0.608 0.666
 0.610 0.399
 0.630 0.549
 0.637 0.298
 0.643 0.352
 0.647 0.662
 0.647 0.327
 0.648 0.519
 0.652 0.521
 0.657 0.074
 0.665 0.308
 0.667 0.237
 0.668 0.090
 0.668 0.368
 0.670 0.272
 0.671 0.467
 0.680 0.107
 0.683 0.304
 0.689 0.161
 0.689 0.244
 0.689 0.314
 0.690 0.379
 0.691 0.436
 0.698 0.212
 0.702 0.252
 0.703 0.132
 0.718 0.192
 0.718 0.189
 0.719 0.260
 0.731 0.126
 0.753 0.310
 0.768 0.313
 0.775 0.320
 0.779 0.345
 0.804 0.382
 0.805 0.347
 0.805 0.477
 0.817 0.370
 0.820 0.469
 0.822 0.525
 0.823 0.420
 0.826 0.366
 0.828 0.413
 0.830 0.407
 0.834 0.344
 0.839 0.339
 0.840 0.314
 0.845 0.300
 0.847 0.293
 0.848 0.265
 0.852 0.327
 0.857 0.218
 0.877 0.087
 0.880 0.066
 0.881 0.084
 0.885 0.011
 0.886 0.056
 0.886 0.020
 0.895 -0.048
 0.896 -0.049
 0.904 -0.101
 0.905 -0.071
 0.908 -0.071
 0.908 -0.118
 0.914 -0.092
 0.916 -0.113
 0.920 -0.116
 0.924 -0.120
 0.925 -0.098
 0.940 -0.088
 0.942 -0.072
 0.943 -0.092
 0.943 -0.078
 0.946 -0.075
 0.950 -0.056
 0.955 -0.018
 0.963 0.024
 0.970 0.066
 0.973 0.080
 0.975 0.089
 0.981 0.122
 0.982 0.128
 0.993 0.160
 0.996 0.164
 0.999 0.167
 ;

 ods graphics on;

 proc sgplot data=difficult;
    title "Scatter Plot of Y versus X";
    scatter x=x y=y ;
 run;

 title;

 proc iml;
    use difficult;
    /* read x and y from difficult into temp */
    read all var _num_ into temp;
    x = temp[,1];
    /* generate B-spline basis for a cubic spline
       with 4 evenly spaced internal knots in the x-range */
    bsp = bspline(x, 2, ., 4);
    combined = temp || bsp;
    /* create a merged data set with x, y, and
       spline basis columns                    */
    create combined var {x y col1 col2 col3 col4 col5 col6 col7};
    append from combined;
 quit;

 proc ssm data=combined opt(tech=dbldog);
    id x;
    /* parameters needed to define h(x) */
    parms v1-v7;
    /* defining h(x) */
    var = exp(v1*col1 + v2*col2 + v3*col3 + v4*col4
       + v5*col5 + v6*col6 + v7*col7);
    /* defining the polynomial spline trend */
    trend trend(ps(2));
    /* defining the observation noise with variance h(x) */
    irregular wn variance=var;
    model y = trend wn;
    output out=for pdv;
 run;

 proc sgplot data=for;
    title "Variable Bandwidth Smoothing Spline";
    band x=x lower=smoothed_lower_trend
       upper=smoothed_upper_trend ;
    series x=x y=smoothed_trend;
    scatter x=x y=y;
 run;

 proc sgplot data=for;
    title "Estimated Variance Function";
    series x=x y=var;
 run;