「loess.smoot」を使用しているが、「loess」または「lowess」を使用しないエラー

StackOverflow https://stackoverflow.com/questions/4645682

  •  09-10-2019
  •  | 
  •  

質問

いくつかのシミュレートされたデータをスムーズにする必要がありますが、シミュレートされた縦座標が滑らかになる場合に問題が発生する場合があります。これは、最も単純なケースの小さな再現可能な例です。

> 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. プログラムが次のシミュレートされたデータセットに移動するのを止めない方法でエラーを処理します。

この問題に関する助けを前もってありがとう。

役に立ちましたか?

解決

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

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

モデルが適合します。これは、異なるデフォルトが原因で発生します loess.smoothloess;前者は持っています family = c("symmetric", "gaussian") 後者はそれを逆転させます。コードをトロールする場合 loessloess.smooth, 、あなたはそれをいつ見るでしょう family = "gaussian" iterations に設定されています 1. 。それ以外の場合は、値が必要です loess.control()$iterations. 。あなたが反復を行う場合 simpleLoess, 、次の関数呼び出しは、ベクトルを返します NaN:

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(The Method)の堅牢なフィッティングに関連しています。堅牢なフィットを望まない/必要としない場合は、使用してください 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?tryCatch あなたはあなたが黄土のフィッティング関数を回転させることができます(loess.smooth たとえば)、エラーが発生した場合に計算を継続できるようになります loess.smooth 遭遇します。

の出力を処理する必要があります try また tryCatch のようなものを含めることによって(あなたがこれをループで行っている場合:

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

私はおそらく組み合わせるでしょう try また tryCatch フィッティングで loess そして使用します predict そのような問題のために。

他のヒント

これらの機能に遭遇したのはこれが初めてであるので、そんなに助けになることはできませんが、Y値に0の分散があることとは関係ありませんか?これで、すでに滑らかなデータからスムーズな線を推定しようとします。これは機能します。

x <- 0:50
y <- c(rep(0,25),rep(1,26))
loess.smooth(x,y)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top