Generates spline basis matrices for fitting to dose-response function

genspline(
  x,
  spline = "bs",
  df = 1,
  knots = NULL,
  degree = 3,
  max.dose = max(x),
  boundaries = NULL
)

Arguments

x

A numeric vector indicating all time points available in the dataset

spline

Indicates the type of spline function. Can be either a natural cubic spline ("ns"), or B-spline ("bs").

df

degrees of freedom. One can supply df rather than knots; ns() then chooses df - 1 - intercept knots at suitably chosen quantiles of x (which will ignore missing values). The default, df = NULL, sets the number of inner knots as length(knots).

knots

Indicates the number/location of internal knots. If a single whole number >=1 is given it indicates the number of equally-spaced internal knots. Otherwise (a vector, or a non-integer value) the values are treated as the quantile locations of the knots as a proportion of the maximum dose in the dataset. For example, if the maximum dose in the dataset is 100mg/d for a particular agent, knots=c(0.1,0.5) would indicate knots should be fitted at 10mg/d and 50mg/d.

degree

a positive integer giving the degree of the polynomial from which the spline function is composed (e.g. degree=3 represents a cubic spline).

max.dose

A number indicating the maximum dose between which to calculate the spline function.

boundaries

A positive numeric vector of length 2 that represents the doses at which to anchor the B-spline or natural cubic spline basis matrix. This allows data to extend beyond the boundary knots, or for the basis parameters to not depend on x. The default (boundaries=NULL) is the range of x.

Value

A spline basis matrix with number of rows equal to length(x) and the number of columns equal to the number of coefficients in the spline.

Examples

x <- 0:100

genspline(x)
#> Warning: 'df' was too small; have used 3
#>            1        2        3
#> 0   0.000000 0.000000 0.000000
#> 1   0.029403 0.000297 0.000001
#> 2   0.057624 0.001176 0.000008
#> 3   0.084681 0.002619 0.000027
#> 4   0.110592 0.004608 0.000064
#> 5   0.135375 0.007125 0.000125
#> 6   0.159048 0.010152 0.000216
#> 7   0.181629 0.013671 0.000343
#> 8   0.203136 0.017664 0.000512
#> 9   0.223587 0.022113 0.000729
#> 10  0.243000 0.027000 0.001000
#> 11  0.261393 0.032307 0.001331
#> 12  0.278784 0.038016 0.001728
#> 13  0.295191 0.044109 0.002197
#> 14  0.310632 0.050568 0.002744
#> 15  0.325125 0.057375 0.003375
#> 16  0.338688 0.064512 0.004096
#> 17  0.351339 0.071961 0.004913
#> 18  0.363096 0.079704 0.005832
#> 19  0.373977 0.087723 0.006859
#> 20  0.384000 0.096000 0.008000
#> 21  0.393183 0.104517 0.009261
#> 22  0.401544 0.113256 0.010648
#> 23  0.409101 0.122199 0.012167
#> 24  0.415872 0.131328 0.013824
#> 25  0.421875 0.140625 0.015625
#> 26  0.427128 0.150072 0.017576
#> 27  0.431649 0.159651 0.019683
#> 28  0.435456 0.169344 0.021952
#> 29  0.438567 0.179133 0.024389
#> 30  0.441000 0.189000 0.027000
#> 31  0.442773 0.198927 0.029791
#> 32  0.443904 0.208896 0.032768
#> 33  0.444411 0.218889 0.035937
#> 34  0.444312 0.228888 0.039304
#> 35  0.443625 0.238875 0.042875
#> 36  0.442368 0.248832 0.046656
#> 37  0.440559 0.258741 0.050653
#> 38  0.438216 0.268584 0.054872
#> 39  0.435357 0.278343 0.059319
#> 40  0.432000 0.288000 0.064000
#> 41  0.428163 0.297537 0.068921
#> 42  0.423864 0.306936 0.074088
#> 43  0.419121 0.316179 0.079507
#> 44  0.413952 0.325248 0.085184
#> 45  0.408375 0.334125 0.091125
#> 46  0.402408 0.342792 0.097336
#> 47  0.396069 0.351231 0.103823
#> 48  0.389376 0.359424 0.110592
#> 49  0.382347 0.367353 0.117649
#> 50  0.375000 0.375000 0.125000
#> 51  0.367353 0.382347 0.132651
#> 52  0.359424 0.389376 0.140608
#> 53  0.351231 0.396069 0.148877
#> 54  0.342792 0.402408 0.157464
#> 55  0.334125 0.408375 0.166375
#> 56  0.325248 0.413952 0.175616
#> 57  0.316179 0.419121 0.185193
#> 58  0.306936 0.423864 0.195112
#> 59  0.297537 0.428163 0.205379
#> 60  0.288000 0.432000 0.216000
#> 61  0.278343 0.435357 0.226981
#> 62  0.268584 0.438216 0.238328
#> 63  0.258741 0.440559 0.250047
#> 64  0.248832 0.442368 0.262144
#> 65  0.238875 0.443625 0.274625
#> 66  0.228888 0.444312 0.287496
#> 67  0.218889 0.444411 0.300763
#> 68  0.208896 0.443904 0.314432
#> 69  0.198927 0.442773 0.328509
#> 70  0.189000 0.441000 0.343000
#> 71  0.179133 0.438567 0.357911
#> 72  0.169344 0.435456 0.373248
#> 73  0.159651 0.431649 0.389017
#> 74  0.150072 0.427128 0.405224
#> 75  0.140625 0.421875 0.421875
#> 76  0.131328 0.415872 0.438976
#> 77  0.122199 0.409101 0.456533
#> 78  0.113256 0.401544 0.474552
#> 79  0.104517 0.393183 0.493039
#> 80  0.096000 0.384000 0.512000
#> 81  0.087723 0.373977 0.531441
#> 82  0.079704 0.363096 0.551368
#> 83  0.071961 0.351339 0.571787
#> 84  0.064512 0.338688 0.592704
#> 85  0.057375 0.325125 0.614125
#> 86  0.050568 0.310632 0.636056
#> 87  0.044109 0.295191 0.658503
#> 88  0.038016 0.278784 0.681472
#> 89  0.032307 0.261393 0.704969
#> 90  0.027000 0.243000 0.729000
#> 91  0.022113 0.223587 0.753571
#> 92  0.017664 0.203136 0.778688
#> 93  0.013671 0.181629 0.804357
#> 94  0.010152 0.159048 0.830584
#> 95  0.007125 0.135375 0.857375
#> 96  0.004608 0.110592 0.884736
#> 97  0.002619 0.084681 0.912673
#> 98  0.001176 0.057624 0.941192
#> 99  0.000297 0.029403 0.970299
#> 100 0.000000 0.000000 1.000000

# Generate a quadratic B-spline with 1 equally spaced internal knot
genspline(x, spline="bs", df=2, degree=2)
#>          1      2
#> 0   0.0000 0.0000
#> 1   0.0198 0.0001
#> 2   0.0392 0.0004
#> 3   0.0582 0.0009
#> 4   0.0768 0.0016
#> 5   0.0950 0.0025
#> 6   0.1128 0.0036
#> 7   0.1302 0.0049
#> 8   0.1472 0.0064
#> 9   0.1638 0.0081
#> 10  0.1800 0.0100
#> 11  0.1958 0.0121
#> 12  0.2112 0.0144
#> 13  0.2262 0.0169
#> 14  0.2408 0.0196
#> 15  0.2550 0.0225
#> 16  0.2688 0.0256
#> 17  0.2822 0.0289
#> 18  0.2952 0.0324
#> 19  0.3078 0.0361
#> 20  0.3200 0.0400
#> 21  0.3318 0.0441
#> 22  0.3432 0.0484
#> 23  0.3542 0.0529
#> 24  0.3648 0.0576
#> 25  0.3750 0.0625
#> 26  0.3848 0.0676
#> 27  0.3942 0.0729
#> 28  0.4032 0.0784
#> 29  0.4118 0.0841
#> 30  0.4200 0.0900
#> 31  0.4278 0.0961
#> 32  0.4352 0.1024
#> 33  0.4422 0.1089
#> 34  0.4488 0.1156
#> 35  0.4550 0.1225
#> 36  0.4608 0.1296
#> 37  0.4662 0.1369
#> 38  0.4712 0.1444
#> 39  0.4758 0.1521
#> 40  0.4800 0.1600
#> 41  0.4838 0.1681
#> 42  0.4872 0.1764
#> 43  0.4902 0.1849
#> 44  0.4928 0.1936
#> 45  0.4950 0.2025
#> 46  0.4968 0.2116
#> 47  0.4982 0.2209
#> 48  0.4992 0.2304
#> 49  0.4998 0.2401
#> 50  0.5000 0.2500
#> 51  0.4998 0.2601
#> 52  0.4992 0.2704
#> 53  0.4982 0.2809
#> 54  0.4968 0.2916
#> 55  0.4950 0.3025
#> 56  0.4928 0.3136
#> 57  0.4902 0.3249
#> 58  0.4872 0.3364
#> 59  0.4838 0.3481
#> 60  0.4800 0.3600
#> 61  0.4758 0.3721
#> 62  0.4712 0.3844
#> 63  0.4662 0.3969
#> 64  0.4608 0.4096
#> 65  0.4550 0.4225
#> 66  0.4488 0.4356
#> 67  0.4422 0.4489
#> 68  0.4352 0.4624
#> 69  0.4278 0.4761
#> 70  0.4200 0.4900
#> 71  0.4118 0.5041
#> 72  0.4032 0.5184
#> 73  0.3942 0.5329
#> 74  0.3848 0.5476
#> 75  0.3750 0.5625
#> 76  0.3648 0.5776
#> 77  0.3542 0.5929
#> 78  0.3432 0.6084
#> 79  0.3318 0.6241
#> 80  0.3200 0.6400
#> 81  0.3078 0.6561
#> 82  0.2952 0.6724
#> 83  0.2822 0.6889
#> 84  0.2688 0.7056
#> 85  0.2550 0.7225
#> 86  0.2408 0.7396
#> 87  0.2262 0.7569
#> 88  0.2112 0.7744
#> 89  0.1958 0.7921
#> 90  0.1800 0.8100
#> 91  0.1638 0.8281
#> 92  0.1472 0.8464
#> 93  0.1302 0.8649
#> 94  0.1128 0.8836
#> 95  0.0950 0.9025
#> 96  0.0768 0.9216
#> 97  0.0582 0.9409
#> 98  0.0392 0.9604
#> 99  0.0198 0.9801
#> 100 0.0000 1.0000

# Generate a natural cubic spline with 3 knots at selected quantiles
genspline(x, spline="ns", knots=c(0.1, 0.5, 0.7))
#>                1            2          3            4
#> 0   0.000000e+00  0.000000000 0.00000000  0.000000000
#> 1   2.857143e-05 -0.014927620 0.03980699 -0.024879367
#> 2   2.285714e-04 -0.029744212 0.07931790 -0.049573687
#> 3   7.714286e-04 -0.044338747 0.11823666 -0.073897912
#> 4   1.828571e-03 -0.058600197 0.15626719 -0.097666996
#> 5   3.571429e-03 -0.072417534 0.19311342 -0.120695890
#> 6   6.171429e-03 -0.085679729 0.22847928 -0.142799548
#> 7   9.800000e-03 -0.098275754 0.26206868 -0.163792923
#> 8   1.462857e-02 -0.110094580 0.29358555 -0.183490967
#> 9   2.082857e-02 -0.121025179 0.32273381 -0.201708632
#> 10  2.857143e-02 -0.130956524 0.34921740 -0.218260873
#> 11  3.798228e-02 -0.139798290 0.37280779 -0.233004866
#> 12  4.900106e-02 -0.147542979 0.39354671 -0.245966693
#> 13  6.152143e-02 -0.154203797 0.41154346 -0.257214661
#> 14  7.543704e-02 -0.159793949 0.42690732 -0.266817076
#> 15  9.064153e-02 -0.164326642 0.43974759 -0.274842244
#> 16  1.070286e-01 -0.167815083 0.45017355 -0.281358472
#> 17  1.244918e-01 -0.170272477 0.45829451 -0.286434066
#> 18  1.429249e-01 -0.171712030 0.46421973 -0.290137334
#> 19  1.622214e-01 -0.172146949 0.46805853 -0.292536581
#> 20  1.822751e-01 -0.171590439 0.46992018 -0.293700114
#> 21  2.029796e-01 -0.170055707 0.46991398 -0.293696240
#> 22  2.242286e-01 -0.167555959 0.46814922 -0.292593265
#> 23  2.459156e-01 -0.164104401 0.46473519 -0.290459496
#> 24  2.679344e-01 -0.159714240 0.45978118 -0.287363239
#> 25  2.901786e-01 -0.154398680 0.45339648 -0.283372800
#> 26  3.125418e-01 -0.148170929 0.44569038 -0.278556487
#> 27  3.349177e-01 -0.141044193 0.43677217 -0.272982605
#> 28  3.572000e-01 -0.133031677 0.42675114 -0.266719462
#> 29  3.792823e-01 -0.124146589 0.41573658 -0.259835364
#> 30  4.010582e-01 -0.114402133 0.40383779 -0.252398616
#> 31  4.224214e-01 -0.103811516 0.39116404 -0.244477527
#> 32  4.432656e-01 -0.092387945 0.37782464 -0.236140402
#> 33  4.634844e-01 -0.080144625 0.36392888 -0.227455548
#> 34  4.829714e-01 -0.067094763 0.34958603 -0.218491271
#> 35  5.016204e-01 -0.053251564 0.33490541 -0.209315878
#> 36  5.193249e-01 -0.038628235 0.31999628 -0.199997676
#> 37  5.359786e-01 -0.023237982 0.30496795 -0.190604970
#> 38  5.514751e-01 -0.007094011 0.28992971 -0.181206068
#> 39  5.657082e-01  0.009790471 0.27499084 -0.171869276
#> 40  5.785714e-01  0.027402259 0.26026064 -0.162662901
#> 41  5.899585e-01  0.045728147 0.24584840 -0.153655248
#> 42  5.997630e-01  0.064754928 0.23186340 -0.144914626
#> 43  6.078786e-01  0.084469397 0.21841494 -0.136509339
#> 44  6.141989e-01  0.104858346 0.20561231 -0.128507695
#> 45  6.186177e-01  0.125908571 0.19356480 -0.120978000
#> 46  6.210286e-01  0.147606864 0.18238170 -0.113988560
#> 47  6.213251e-01  0.169940020 0.17217229 -0.107607683
#> 48  6.194011e-01  0.192894832 0.16304588 -0.101903675
#> 49  6.151500e-01  0.216458095 0.15511175 -0.096944841
#> 50  6.084656e-01  0.240616602 0.14847918 -0.092799490
#> 51  5.992915e-01  0.265331143 0.14322683 -0.089504269
#> 52  5.877714e-01  0.290458483 0.13931071 -0.086969195
#> 53  5.740989e-01  0.315829385 0.13665621 -0.085072629
#> 54  5.584677e-01  0.341274612 0.13518869 -0.083692931
#> 55  5.410714e-01  0.366624925 0.13483353 -0.082708458
#> 56  5.221037e-01  0.391711086 0.13551612 -0.081997572
#> 57  5.017582e-01  0.416363858 0.13716181 -0.081438631
#> 58  4.802286e-01  0.440414002 0.13969599 -0.080909996
#> 59  4.577085e-01  0.463692281 0.14304404 -0.080290025
#> 60  4.343915e-01  0.486029456 0.14713133 -0.079457079
#> 61  4.104714e-01  0.507256290 0.15188323 -0.078289517
#> 62  3.861418e-01  0.527203544 0.15722512 -0.076665698
#> 63  3.615963e-01  0.545701981 0.16308237 -0.074463982
#> 64  3.370286e-01  0.562582363 0.16938037 -0.071562729
#> 65  3.126323e-01  0.577675451 0.17604448 -0.067840298
#> 66  2.886011e-01  0.590812008 0.18300008 -0.063175049
#> 67  2.651286e-01  0.601822795 0.19017255 -0.057445341
#> 68  2.424085e-01  0.610538576 0.19748725 -0.050529534
#> 69  2.206344e-01  0.616790111 0.20486958 -0.042305988
#> 70  2.000000e-01  0.620408163 0.21224490 -0.032653061
#> 71  1.806593e-01  0.621267271 0.21955147 -0.021478005
#> 72  1.626074e-01  0.619417082 0.22677914 -0.008803628
#> 73  1.458000e-01  0.614951020 0.23393061  0.005318367
#> 74  1.301926e-01  0.607962509 0.24100862  0.020836281
#> 75  1.157407e-01  0.598544974 0.24801587  0.037698413
#> 76  1.024000e-01  0.586791837 0.25495510  0.055853061
#> 77  9.012593e-02  0.572796523 0.26182902  0.075248526
#> 78  7.887407e-02  0.556652457 0.26864036  0.095833107
#> 79  6.860000e-02  0.538453061 0.27539184  0.117555102
#> 80  5.925926e-02  0.518291761 0.28208617  0.140362812
#> 81  5.080741e-02  0.496261980 0.28872608  0.164204535
#> 82  4.320000e-02  0.472457143 0.29531429  0.189028571
#> 83  3.639259e-02  0.446970673 0.30185351  0.214783220
#> 84  3.034074e-02  0.419895994 0.30834649  0.241416780
#> 85  2.500000e-02  0.391326531 0.31479592  0.268877551
#> 86  2.032593e-02  0.361355707 0.32120454  0.297113832
#> 87  1.627407e-02  0.330076946 0.32757506  0.326073923
#> 88  1.280000e-02  0.297583673 0.33391020  0.355706122
#> 89  9.859259e-03  0.263969312 0.34021270  0.385958730
#> 90  7.407407e-03  0.229327286 0.34648526  0.416780045
#> 91  5.400000e-03  0.193751020 0.35273061  0.448118367
#> 92  3.792593e-03  0.157333938 0.35895147  0.479921995
#> 93  2.540741e-03  0.120169463 0.36515057  0.512139229
#> 94  1.600000e-03  0.082351020 0.37133061  0.544718367
#> 95  9.259259e-04  0.043972033 0.37749433  0.577607710
#> 96  4.740741e-04  0.005125926 0.38364444  0.610755556
#> 97  2.000000e-04 -0.034093878 0.38978367  0.644110204
#> 98  5.925926e-05 -0.073593953 0.39591474  0.677619955
#> 99  7.407407e-06 -0.113280877 0.40204036  0.711233107
#> 100 0.000000e+00 -0.153061224 0.40816327  0.744897959

# Generate a piecewise linear spline with 2 equally spaced knots
genspline(x, spline="bs", degree=1, df=3)
#>        1    2    3
#> 0   0.00 0.00 0.00
#> 1   0.03 0.00 0.00
#> 2   0.06 0.00 0.00
#> 3   0.09 0.00 0.00
#> 4   0.12 0.00 0.00
#> 5   0.15 0.00 0.00
#> 6   0.18 0.00 0.00
#> 7   0.21 0.00 0.00
#> 8   0.24 0.00 0.00
#> 9   0.27 0.00 0.00
#> 10  0.30 0.00 0.00
#> 11  0.33 0.00 0.00
#> 12  0.36 0.00 0.00
#> 13  0.39 0.00 0.00
#> 14  0.42 0.00 0.00
#> 15  0.45 0.00 0.00
#> 16  0.48 0.00 0.00
#> 17  0.51 0.00 0.00
#> 18  0.54 0.00 0.00
#> 19  0.57 0.00 0.00
#> 20  0.60 0.00 0.00
#> 21  0.63 0.00 0.00
#> 22  0.66 0.00 0.00
#> 23  0.69 0.00 0.00
#> 24  0.72 0.00 0.00
#> 25  0.75 0.00 0.00
#> 26  0.78 0.00 0.00
#> 27  0.81 0.00 0.00
#> 28  0.84 0.00 0.00
#> 29  0.87 0.00 0.00
#> 30  0.90 0.00 0.00
#> 31  0.93 0.00 0.00
#> 32  0.96 0.00 0.00
#> 33  0.99 0.00 0.00
#> 34  0.98 0.02 0.00
#> 35  0.95 0.05 0.00
#> 36  0.92 0.08 0.00
#> 37  0.89 0.11 0.00
#> 38  0.86 0.14 0.00
#> 39  0.83 0.17 0.00
#> 40  0.80 0.20 0.00
#> 41  0.77 0.23 0.00
#> 42  0.74 0.26 0.00
#> 43  0.71 0.29 0.00
#> 44  0.68 0.32 0.00
#> 45  0.65 0.35 0.00
#> 46  0.62 0.38 0.00
#> 47  0.59 0.41 0.00
#> 48  0.56 0.44 0.00
#> 49  0.53 0.47 0.00
#> 50  0.50 0.50 0.00
#> 51  0.47 0.53 0.00
#> 52  0.44 0.56 0.00
#> 53  0.41 0.59 0.00
#> 54  0.38 0.62 0.00
#> 55  0.35 0.65 0.00
#> 56  0.32 0.68 0.00
#> 57  0.29 0.71 0.00
#> 58  0.26 0.74 0.00
#> 59  0.23 0.77 0.00
#> 60  0.20 0.80 0.00
#> 61  0.17 0.83 0.00
#> 62  0.14 0.86 0.00
#> 63  0.11 0.89 0.00
#> 64  0.08 0.92 0.00
#> 65  0.05 0.95 0.00
#> 66  0.02 0.98 0.00
#> 67  0.00 0.99 0.01
#> 68  0.00 0.96 0.04
#> 69  0.00 0.93 0.07
#> 70  0.00 0.90 0.10
#> 71  0.00 0.87 0.13
#> 72  0.00 0.84 0.16
#> 73  0.00 0.81 0.19
#> 74  0.00 0.78 0.22
#> 75  0.00 0.75 0.25
#> 76  0.00 0.72 0.28
#> 77  0.00 0.69 0.31
#> 78  0.00 0.66 0.34
#> 79  0.00 0.63 0.37
#> 80  0.00 0.60 0.40
#> 81  0.00 0.57 0.43
#> 82  0.00 0.54 0.46
#> 83  0.00 0.51 0.49
#> 84  0.00 0.48 0.52
#> 85  0.00 0.45 0.55
#> 86  0.00 0.42 0.58
#> 87  0.00 0.39 0.61
#> 88  0.00 0.36 0.64
#> 89  0.00 0.33 0.67
#> 90  0.00 0.30 0.70
#> 91  0.00 0.27 0.73
#> 92  0.00 0.24 0.76
#> 93  0.00 0.21 0.79
#> 94  0.00 0.18 0.82
#> 95  0.00 0.15 0.85
#> 96  0.00 0.12 0.88
#> 97  0.00 0.09 0.91
#> 98  0.00 0.06 0.94
#> 99  0.00 0.03 0.97
#> 100 0.00 0.00 1.00