線形・定数で値の補間を行う
欠損データを扱う場合や疎らにしか取得できないデータを扱う場合に、補間をしなければならない。そんな時には
- approx
- approxfun
の関数を使う。名前から判断できるようにapproxfunの方は補間用の関数を返してくれて、これはとても使い勝手が良い。この関数だと”定数”で補間するか”線形”で補間するかの二つのやり方から選択することになるので、もうちょい手の込んだスプライン補間をしたい場合は「spline関数」を使用しましょう。
まずはHelpにあるようにサンプルデータを用意
> x <- 1:10 > y <- rnorm(10)
これを何も考えないでapprox関数に突っ込んでみると・・・
> approx(x, y) $x [1] 1.000000 1.183673 1.367347 1.551020 1.734694 1.918367 2.102041 2.285714 2.469388 [10] 2.653061 2.836735 3.020408 3.204082 3.387755 3.571429 3.755102 3.938776 4.122449 [19] 4.306122 4.489796 4.673469 4.857143 5.040816 5.224490 5.408163 5.591837 5.775510 [28] 5.959184 6.142857 6.326531 6.510204 6.693878 6.877551 7.061224 7.244898 7.428571 [37] 7.612245 7.795918 7.979592 8.163265 8.346939 8.530612 8.714286 8.897959 9.081633 [46] 9.265306 9.448980 9.632653 9.816327 10.000000 $y [1] 0.34413401 0.47872248 0.61331096 0.74789944 0.88248791 1.01707639 0.82812473 0.38034097 [9] -0.06744280 -0.51522656 -0.96301033 -1.35178834 -1.26852028 -1.18525223 -1.10198417 -1.01871611 [17] -0.93544806 -0.87294527 -0.82082512 -0.76870497 -0.71658482 -0.66446467 -0.64040975 -0.71458318 [25] -0.78875660 -0.86293002 -0.93710345 -1.01127687 -0.92493693 -0.79273604 -0.66053514 -0.52833424 [33] -0.39613334 -0.25471233 -0.09485106 0.06501020 0.22487146 0.38473272 0.54459398 0.53673301 [41] 0.50790676 0.47908051 0.45025426 0.42142801 0.30131648 0.06709834 -0.16711979 -0.40133792 [49] -0.63555605 -0.86977418
と合計50点になるように補間された値が出力される。この”50”という数を制御したければ、引数に「n = 20」等と指定することで、補間する点数を指定できる。
> approx(x, y, n = 20) $x [1] 1.000000 1.473684 1.947368 2.421053 2.894737 3.368421 3.842105 4.315789 4.789474 [10] 5.263158 5.736842 6.210526 6.684211 7.157895 7.631579 8.105263 8.578947 9.052632 [19] 9.526316 10.000000 $y [1] 0.34413401 0.69123060 1.03832720 0.05039503 -1.10441573 -1.19401728 -0.97927335 -0.81808196 [9] -0.68366683 -0.73019863 -0.92148799 -0.87623134 -0.53529218 -0.17057482 0.24169896 0.54583604 [17] 0.47149465 0.33829829 -0.26573795 -0.86977418
指定した点を補間したい場合は「xout = 3」等と指定することで、補間した値を返す点(Not 点数)を指定できる。
> approx(x, y, xout = seq(1, 10, 0.3)) $x [1] 1.0 1.3 1.6 1.9 2.2 2.5 2.8 3.1 3.4 3.7 4.0 4.3 4.6 4.9 5.2 5.5 5.8 6.1 6.4 [20] 6.7 7.0 7.3 7.6 7.9 8.2 8.5 8.8 9.1 9.4 9.7 10.0 $y [1] 0.34413401 0.56396185 0.78378970 1.00361754 0.58930672 -0.14207343 -0.87345358 -1.31570551 [9] -1.17970102 -1.04369653 -0.90769204 -0.82256246 -0.73743288 -0.65230330 -0.70469339 -0.82584331 [17] -0.94699324 -0.95578381 -0.73985568 -0.52392755 -0.30799941 -0.04689269 0.21421404 0.47532077 [25] 0.53096776 0.48388488 0.43680201 0.27789466 -0.10466162 -0.48721790 -0.86977418
approxfunのほうは補間するための関数を結果として返してくれる。
> f <- approxfun(x, y) > f(1:10) [1] 0.3441340 1.0768935 -1.3610403 -0.9076920 -0.6239268 -1.0277599 -0.3079994 0.5623563 [9] 0.4054134 -0.8697742 > f(seq(1, 10, 0.5)) [1] 0.3441340 0.7105137 1.0768935 -0.1420734 -1.3610403 -1.1343662 -0.9076920 -0.7658094 [9] -0.6239268 -0.8258433 -1.0277599 -0.6678796 -0.3079994 0.1271785 0.5623563 0.4838849 [17] 0.4054134 -0.2321804 -0.8697742
ここで紹介した両関数ともデフォルトでは線形補間になっているので、定数で補間したい場合は関数の引数に「method="constant"」と追加指定する。
また補外についてはデフォルトだとNAを返すようになっているが「rule = 2」と指定することで最近値で補間されるようになる。