7

シミュレートされたデータを平滑化する必要がありますが、平滑化されるシミュレートされた縦座標がほぼ同じ値である場合に問題が発生することがあります。これは、最も単純なケースの再現可能な小さな例です。

> x <- 0:50
> y <- rep(0,51)
> loess.smooth(x,y)
Error in simpleLoess(y, x, w, span, degree, FALSE, FALSE, normalize = FALSE,  : 
   NA/NaN/Inf in foreign function call (arg 1)

loess(y~x)lowess(x,y)、および MATLAB でのそれらの類似物は、この例でエラーなしで期待される結果を生成します。ここで使用しloess.smoothているのは、設定された数のポイントで評価された見積もりが必要だからです。ドキュメントによると、私は同じ推定関数を使用していると信じていますloess.smoothloess、前者は評価ポイントを処理するための「補助関数」です。エラーはC関数から来ているようです:

> traceback()
3: .C(R_loess_raw, as.double(pseudovalues), as.double(x), as.double(weights), 
   as.double(weights), as.integer(D), as.integer(N), as.double(span), 
   as.integer(degree), as.integer(nonparametric), as.integer(order.drop.sqr), 
   as.integer(sum.drop.sqr), as.double(span * cell), as.character(surf.stat), 
   temp = double(N), parameter = integer(7), a = integer(max.kd), 
   xi = double(max.kd), vert = double(2 * D), vval = double((D + 
       1) * max.kd), diagonal = double(N), trL = double(1), 
   delta1 = double(1), delta2 = double(1), as.integer(0L))
2: simpleLoess(y, x, w, span, degree, FALSE, FALSE, normalize = FALSE, 
   "none", "interpolate", control$cell, iterations, control$trace.hat)
1: loess.smooth(x, y)

loessも呼び出しますsimpleLoessが、異なる引数のように見えます。もちろん、y の値を十分に変化させてゼロ以外にすると、loess.smoothはエラーなしで実行されますが、最も極端な場合でもプログラムを実行する必要があります。

うまくいけば、誰かが次の1つまたはすべてで私を助けることができます:

  1. loess.smooth他の関数ではなく のみがこのエラーを生成する理由を理解し、この問題の解決策を見つけてください。
  2. loessベクトル x とは異なる可能性がある指定された数のポイントで推定値を使用して評価する回避策を見つけます。たとえばx <- seq(0,50,10)、平滑化でのみ使用したい場合がありますが、推定値は で評価しx <- 0:50ます。私の知る限りpredict、新しいデータ フレームを使用すると、この状況を適切に処理できませんが、何か不足している場合はお知らせください。
  3. プログラムが次のシミュレートされたデータ セットに移動するのを止めない方法でエラーを処理します。

この問題についてご協力いただきありがとうございます。

4

2 に答える 2

8

パート 1 の場合: これには少し追跡が必要でしたが、そうすると:

loess.smooth(x, y, family = "guassian")

モデルが収まります。これは、 と のデフォルトが異なるために発生しloess.smoothますloess。前者はfamily = c("symmetric", "gaussian")逆になっていますが、後者は逆になっています。とのコードを調べてみるloessと、 whenが に設定されていることがわかります。それ以外の場合は、値を取ります。で反復を行う場合、次の関数呼び出しは のベクトルを返します。loess.smoothfamily = "gaussian" iterations1loess.control()$iterationssimpleLoessNaN

pseudovalues <- .Fortran(R_lowesp, as.integer(N), as.double(y), 
            as.double(z$fitted.values), as.double(weights), as.double(robust), 
            integer(N), pseudovalues = double(N))$pseudovalues

これにより、次の関数呼び出しで見たエラーがスローされます。

zz <- .C(R_loess_raw, as.double(pseudovalues), as.double(x), 
            as.double(weights), as.double(weights), as.integer(D), 
            as.integer(N), as.double(span), as.integer(degree), 
            as.integer(nonparametric), as.integer(order.drop.sqr), 
            as.integer(sum.drop.sqr), as.double(span * cell), 
            as.character(surf.stat), temp = double(N), parameter = integer(7), 
            a = integer(max.kd), xi = double(max.kd), vert = double(2 * 
                D), vval = double((D + 1) * max.kd), diagonal = double(N), 
            trL = double(1), delta1 = double(1), delta2 = double(1), 
            as.integer(0L))

これはすべて、Loess (メソッド) でのロバスト フィッティングに関連しています。堅牢なフィットが必要ない場合は、呼び出しで使用family = "gaussian"してください。loess.smooth

また、 のデフォルトは のデフォルトとはloess.smooth異なることに注意してください。loessたとえば、'span'およびの場合'degree'です。そのため、適合させたいモデルを注意深くチェックし、関連する関数のデフォルトを調整してください。

パート 2 の場合:

DF <- data.frame(x = 0:50, y = rep(0,51))
mod <- loess(y ~ x, data = DF)
pred <- predict(mod, newdata = data.frame(x = c(-1, 10, 15, 55)))
mod2 <- loess(y ~ x, data = DF, control = loess.control(surface = "direct"))
pred2 <- predict(mod2, newdata = data.frame(x = c(-1, 10, 15, 55)))

これにより、次のことが得られます。

> pred
 1  2  3  4 
NA  0  0 NA 
> pred2
1 2 3 4 
0 0 0 0

それが意図したものである場合、デフォルトは推定されません。predict実際、ここで使用する際の問題がまったくわかりません。

パート 3:エラーが発生した場合に計算を続行できるようにする黄土フィッティング関数 (たとえば) をラップできるものを 見て?tryください。?tryCatchloess.smoothloess.smooth

tryまたはのような出力を処理する必要がありtryCatchます (これをループで実行している場合:

mod <- try(loess.smooth(x, y))
if(inherits(mod, "try-error"))
    next
## if here, model work, do something with `mod`

私はおそらく、フィッティングを組み合わせtryたり、そのような問題に使用したりします。tryCatchloesspredict

于 2011-01-10T10:44:47.260 に答える
0

これらの関数に遭遇したのはこれが初めてなので、あまり役に立ちませんが、これは y 値の分散が 0 であることと関係があるのではないでしょうか? ここで、可能な限り滑らかなデータから滑らかな線を推定しようとすると、うまくいきます。

x <- 0:50
y <- c(rep(0,25),rep(1,26))
loess.smooth(x,y)
于 2011-01-10T10:36:32.803 に答える