web-dev-qa-db-ja.com

na.approxを使用してデータフレーム内のNA値を補間します

na.approx()を使用した補間によってデータフレームからNAsを削除しようとしていますが、すべてのNAsを削除できません。

私のデータフレームは4096x4096で、無効な値のフラグとして270.15があります。気象モデルを提供するには、すべての点でデータが連続している必要があります。昨日、別のデータフレームに基づいてデータフレームの値を置き換える方法について質問し、回答を得ました。しかしその後、私はna.approx()に行き、270.15の値をNAに置き換え、na.approx()を試してデータを補間することにしました。しかし、問題は、なぜna.approx()がすべてのNAを置き換えるわけではないのかということです。

これは私がしていることです:

  • Hdf5loadで元のhdfファイルを読み取る
  • データフレームのサブセット(4094x4096)
  • フラグ値をNAに置き換えます

    > sst4[sst4 == 270.15 ] = NA
    
  • 最初の列(またはその他)を確認してください

    > summary(sst4[,1])
    
    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
    271.3   276.4   285.9   285.5   292.3   302.8  1345.0
    
  • Na.approxを実行します

    > sst4=na.approx(sst4,na.rm="FALSE")
    
  • 最初の列を確認してください

    > summary(sst4[,1]) 
    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
    271.3   276.5   286.3   285.9   292.6   302.8   411.0
    

ご覧のとおり、411NAは削除されていません。どうして?それらはすべて先頭/終了列の値に対応していますか?

head(sst4[,1])
[1] NA NA NA NA NA NA
tail(sst4[,1])
[1] NA NA NA NA NA NA

Na.approxは、補間するためにNAの前後に有効な値を持つ必要がありますか?他のna.approxオプションを設定する必要がありますか?

どうもありがとうございました

22
pacomet

小さくて再現可能な例:

library(Zoo)
set.seed(1)
m <- matrix(runif(16, 0, 100), nrow = 4)
missing_values <- sample(16, 7)
m[missing_values] <- NA
m
         [,1]     [,2]      [,3]     [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239       NA  6.178627 38.41037
[3,]       NA       NA        NA       NA
[4,] 90.82078 66.07978        NA       NA

na.approx(m)
         [,1]     [,2]      [,3]     [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206  6.178627 38.41037
[3,] 64.01658 50.77592        NA       NA
[4,] 90.82078 66.07978        NA       NA

m[4, 4] <- 50
na.approx(m)
         [,1]     [,2]      [,3]     [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206  6.178627 38.41037
[3,] 64.01658 50.77592        NA 44.20519
[4,] 90.82078 66.07978        NA 50.00000

はい、列の開始値と終了値を知る必要があるようです。そうしないと、補間が機能しません。境界の値を推測できますか?

別の編集:したがって、デフォルトでは、列の開始値と終了値を知る必要があります。ただし、na.approxを渡すことで、常に空白を埋めるようにrule = 2を取得することは可能です。フェリックスの答えを参照してください。 Gaborのコメントに従って、na.fillを使用してデフォルト値を指定することもできます。最後に、境界条件を2方向に補間するか(以下を参照)、境界条件を推測することができます。


編集:さらなる考え。 na.approxは列でのみ補間され、データは空間的であるため、行での補間も役立つ可能性があります。次に、平均を取ることができます。

列全体がNAの場合、na.approxは失敗するため、より大きなデータセットを作成します。

set.seed(1)
m <- matrix(runif(64, 0, 100), nrow = 8)
missing_values <- sample(64, 15)
m[missing_values] <- NA

na.approxを双方向で実行します。

by_col <- na.approx(m)
by_row <- t(na.approx(t(m)))

最良の推測を見つけてください。

default <- 50
best_guess <- ifelse(is.na(by_row), 
  ifelse(
    is.na(by_col), 
    default,              #neither known
    by_col                #only by_col known
  ), 
  ifelse(
    is.na(by_col), 
    by_row,               #only by_row known
    (by_row + by_col) / 2 #both known
  )
)
15
Richie Cotton

na.approx()は、デフォルトでは、値を補間するのではなく、値を補間するだけでapprox()関数の後に続きます。ただし、approx()のヘルプページで説明されているように、rule = 2を指定して、最も近い極値の定数値として外挿することができます。リッチーコットンの例に続いて:

na.approx(m, rule = 2)
         [,1]     [,2]      [,3]     [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206  6.178627 38.41037
[3,] 64.01658 50.77592  6.178627 38.41037
[4,] 90.82078 66.07978  6.178627 38.41037

同様に、「最後の観測の繰り越し」を明示的に使用できます。

na.locf(na.approx(m))
## "first observation carry backwards" too:
na.locf(na.locf(na.approx(m)), fromLast = TRUE)
12
Felix Andrews

na.rm=TRUEを設定してみるべきだと思います

ドキュメントから

na.rm論理。主要なNAを削除する必要がありますか?

http://www.oga-lab.net/RGM2/func.php?rd_id=Zoo:na.approx

1
Henrik