web-dev-qa-db-ja.com

Rでの線形補間

たとえば、次のような実際のデータのデータセットがあります。

_# Dataset 1 with known data
known <- data.frame(
    x = c(0:6),
    y = c(0, 10, 20, 23, 41, 39, 61)
)

plot (known$x, known$y, type="o")
_

ここで、「元のデータセットのすべての中間データポイントが周囲の測定値の間で直線上にある場合、0.3のY値はどうなるでしょうか?」という質問に答えたいと思います。

_ # X values of points to interpolate from known data
 aim <- c(0.3, 0.7, 2.3, 3.3, 4.3, 5.6, 5.9)
_

グラフを見ると、次のようになります。Y値を取得します。ここで、アブラインは既知のデータの線形補間と交差します。

_abline(v = aim, col = "#ff0000")
_

したがって、理想的なケースでは、既知のデータを使用して「linearInterpolationModel」を作成します。

_model <- linearInterpol(known)
_

...次に、Y値を要求できます。

_model$getEstimation(0.3)
_

(この場合、「3」を与える必要があります)

_abline(h = 3, col = "#00ff00")
_

どうすればこれを実現できますか?手動で、値ごとに次のようにします。

  1. 現在のX値Xsmallよりも小さいXlargeに最も近いX値と大きいXに最も近いX値は何ですか。
  2. 小さい方のX値に対する相対位置を計算しますrelPos = (X - Xsmall) / (Xlarge - Xsmall)
  3. 期待されるY値を計算しますYexp = Ysmall + (relPos * (Ylarge - Ysmall))

少なくともソフトウェアMatlabについては、そのような問題のための組み込み関数があると聞きました。

ご協力いただきありがとうございます、

スヴェン

17
R_User

approx()approxfun() ...を見ることができます。または、線形近似の場合はlm、ノンパラメトリック近似の場合はlowessで近似できると思います。 。

18
42-

DWinの回答をフォローアップするために、線形モデルを使用して予測値を取得する方法を次に示します。

model.lm <- lm(y ~ x, data = known)

# Use predict to estimate the values for aim.
# Note that predict expects a data.frame and the col 
# names need to match
newY <- predict(model.lm, newdata = data.frame(x = aim))

#Add the predicted points to the original plot
points(aim, newY, col = "red")

そしてもちろん、これらの予測値を直接取得することもできます。

> cbind(aim, newY)
  aim       newY
1 0.3  2.4500000
2 0.7  6.1928571
3 2.3 21.1642857
....
11
Chase