2017-11-08 89 views
0

Rで双線形補間を行いたいが、は、NAで半分の数字で半分の塗りつぶしを得ているので、 interpという関数でそれを行う方法を理解できない。これは私の問題の例である:私も関数にinterp.surface.gridフォームfieldsを使用してみましたが、それはない、私はそうはありませんすべてのxy使用のための値を持つ行列であることをzあり2次元線形補間でR

x = rep(c(1,2,3,6,9,12)/12,5) 
y = seq(2709,3820,length = 30) 
z = seq(9.2,16.5,length = 30) 

inter_lin = interp(x,y,z,xo = seq(min(x),max(x),length=100), 
        yo = seq(min(y), max(y), length=100), linear=T) 

作業。

EDIT これは私が実際に持っているyzベクトルである:

y = c(2931.076,2901.935,2868.635,2804.006,2760.297,2709.114,2983.466,2969.436,2954.808,2928.802,2915.815,2903.867, 
     3043.365,3051.140,3057.960,3079.230,3103.015,3127.245,3118.090,3156.223,3194.574,3291.021,3380.687,3472.676, 
     3195.631,3260.866,3331.776,3502.477,3658.052,3829.511) 

z = c(10.280984,9.733925, 10.176117, 10.644877, 10.950297, 11.737252, 10.442495, 10.170472, 10.590579, 11.153778 ,11.501962, 
    12.066833,11.000000, 11.025000, 11.450000, 12.125000, 12.550000, 12.875000, 12.142495, 11.870472, 12.390579, 13.053778, 
    13.501962,14.066833,13.005984, 12.458925, 13.051117, 13.694877, 14.150297, 14.937252) 
+0

前と同じ 'X'のベクトルですか? – Lyngbakr

+0

@Lyngbakrはいそれは同じです –

答えて

0

設定linear = FALSEextrap = TRUE

x = rep(c(1,2,3,6,9,12)/12,5) 
y = seq(2709,3820,length = 30) 
z = seq(9.2,16.5,length = 30) 

inter_lin = interp(x,y,z,xo = seq(min(x),max(x),length=100), 
        yo = seq(min(y), max(y), length=100), linear=FALSE, extrap = TRUE) 

私はこの問題が境界の値を補間しており、これがエッジから内側に波及していると思います。線形補間でではなくである外挿を可能にすることで、この問題は回避されます。


編集

補間ドメインはデータが存在する領域に制限されている場合、結果はちょうど桃です。

library(akima) 
library(spatialkernel) 
library(fields) 

# Create grid 
grd <- expand.grid(x = seq(min(x),max(x),length=100), y = seq(min(y), max(y), length=100)) 

# Find points in convex hull 
mask <- pinpoly(cbind(x, y)[chull(x, y),], as.matrix(grd)) 

# Crop grid to convex hull 
grd <- grd[mask == 2,] 

# Interpolate to points in convex hull 
res <- interpp(x, y, z, xo = grd$x, yo = grd$y) 

# Plot results 
quilt.plot(res$x, res$y, res$z) 

enter image description here

+0

@ Lyngbarj、私はそれを試みましたが、私の実際のデータで何らかの理由で補間が間違っています。 22列目から23列目までは、10.07785から71.98672にジャンプし、間違っています。私はなぜこの例でうまくいくのかわかりません。私は実際のデータで質問を更新します –

+0

@alejandroandradeこれは、xが小さく、yが大きく、この領域の誤差が広がる領域で凸包の外側に* waaaay *を外挿しているからですドメインの上部全体にわたって私の提案は、オリジナルの凸包で囲まれたカスタムグリッドを定義し、 'interpp'を使ってこれらの点に補間することです。 – Lyngbakr

+0

@ Lyngbark私はyベクトルを1000で割っても同じエラーが出てくるので、それは問題だとは思わない。私は 'interpp'を試しましたが、私はいくつかの値に対してNAを得ています。とにかく、これはより多くの部族だと思った。 –