「loess.smoot」を使用しているが、「loess」または「lowess」を使用しないエラー
質問
いくつかのシミュレートされたデータをスムーズにする必要がありますが、シミュレートされた縦座標が滑らかになる場合に問題が発生する場合があります。これは、最も単純なケースの小さな再現可能な例です。
> 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.smooth
と loess
同じ推定関数を使用していますが、前者は評価ポイントを処理するための「補助関数」です。エラーは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つおよび/またはすべてを手伝ってくれることができます。
- 理由だけを理解してください
loess.smooth
, 、他の機能ではなく、このエラーを生成し、この問題の解決策を見つけます。 - 使用して作業アラウンドを見つけます
loess
しかし、ベクトルxとは異なる可能性のある指定された数のポイントで推定値を評価します。たとえば、使用するだけかもしれませんx <- seq(0,50,10)
スムージングでは、推定値を評価しますx <- 0:50
. 。私の知る限り、使用してくださいpredict
新しいデータフレームを使用すると、この状況が適切に処理されませんが、そこに何かが足りない場合はお知らせください。 - プログラムが次のシミュレートされたデータセットに移動するのを止めない方法でエラーを処理します。
この問題に関する助けを前もってありがとう。
解決
パート1の場合:これには少し追跡が必要でしたが、そうする場合は次のとおりです。
loess.smooth(x, y, family = "guassian")
モデルが適合します。これは、異なるデフォルトが原因で発生します loess.smooth
と loess
;前者は持っています family = c("symmetric", "gaussian")
後者はそれを逆転させます。コードをトロールする場合 loess
と loess.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)