2011-01-10 23 views
7

Bazı benzetilmiş verileri düzeltmem gerekiyor, ancak zaman zaman simüle edilen ordinatların çoğunlukla aynı değerde olması durumunda sorun yaşanıyor. İşte en basit durumun küçük bir tekrarlanabilir örneği. `loess.smooth` değil,` loess` veya `lowess` kullanıp hata oluştu

> 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) ve MATLAB'te onların analog Bu örnekte üzerinde hatasız beklenen sonuçlar üretir. Burada loess.smooth kullanıyorum çünkü belirli sayılarda değerlendirilen tahminlere ihtiyacım var. Belgelere göre, loess.smooth ve loess'un aynı tahmin işlevlerini kullandığına inanıyorum, ancak eski değerlendirme noktalarını işlemek için bir "yardımcı işlev" dir. Hata C işlevinden geliyor gibi görünüyor:

> 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 da simpleLoess çağırır, ancak farklı argümanlar gibi görünen ile. Tabi ki, y değerlerinin sıfırdan farklı olması durumunda, loess.smooth hatasız çalışır, ancak programın en uç durumda bile çalışmasına ihtiyacım var. ,

  1. neden sadece loess.smooth değil, diğer işlevlerini anlama bu hatayı üretir ve bu soruna yönelik bir çözüm bulmak:

    Umarım, birileri aşağıdakilerden biri ve/veya tüm bana yardımcı olabilir.

  2. loess'u kullanarak bir çalışma bulun, ancak yine de, tahmini x vektöründen farklı olabilecek belirli bir noktadaki değerlendirmeyi değerlendirin. Örneğin, pürüzsüzlükte yalnızca x <- seq(0,50,10) kullanmak isteyebilirim, ancak tahmini değeri x <- 0:50'da değerlendirebilirim. Bildiğim kadarıyla, yeni bir veri çerçevesine sahip predict'un kullanılması, bu durumu düzgün bir şekilde yerine getirmeyecek, ancak bir şeyleri kaçırıyorsam lütfen bana bildirin.
  3. Hatayı, programın bir sonraki simüle edilmiş veri kümesine geçmesini durduracak şekilde kullanmayın.

Bu sorun hakkında herhangi bir yardım için şimdiden teşekkür ederiz.

cevap

7

: Bu izini biraz aldı, ancak bunu yaparsanız :

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

modeli uyacaktır. Bu, loess.smooth ve loess'un farklı varsayılanları nedeniyle ortaya çıkar; Eski family = c("symmetric", "gaussian") iken, ikincisi tersine çevirdi. loess ve loess.smooth kodları arasında dolaşıyorsanız, family = "gaussian"iterations1 olarak ayarlandığında bunu göreceksiniz. Aksi halde loess.control()$iterations değerini alır.Gördüğün hata atmasına sonraki fonksiyon çağrısı neden

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 

: Eğer simpleLoess yılında yinelemeleri yaparsanız, aşağıdaki işlev çağrısı NaN bir vektör döndürür

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)) 

tüm sağlam montaj ile ilgilidir Bu Loess'de (yöntem). Güçlü bir uyumluluk istemiyorsanız/ihtiyacınız varsa, loess.smooth aramanızda family = "gaussian"'u kullanın. Ayrıca, loess.smooth için varsayılan değerlerin loess, örn., loess arasındaki farklara dikkat edin. 'span' ve 'degree' için. Bu nedenle, hangi modellere uyum sağladığınızı dikkatlice kontrol edin ve ilgili işlevin varsayılanlarını ayarlayın. parçası 2 için

:

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))) 

verir Hangi: yani ne anlama geldiğini ise

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

varsayılan tahmin olmayacaktır. Aslında burada predict'un kullanımının ne olduğunu anlamıyorum. parçası 3 için

: Eğer loess.smooth bir hatayla karşılaşılırsa, hesaplamalar devam etmesine olanak sağlayacaktır lös uydurma fonksiyonu (loess.smooth demek), yuvarlak sarabilirsiniz ?try ve ?tryCatch de bak.

Sen bir döngü içinde yapıyoruz if (gibi bir ifade ekleyerek try veya tryCatch çıktısını işlemek gerekir: loess aracılığıyla

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

muhtemelen uydurma ile try veya tryCatch birleştirmek istiyorum ve predict kullanarak Böyle bir problem için

+0

cevabımı şimdi sildiğin mesajın aynısını silindi .. –

+0

@Joris - silme zorunluluğuna sahibim Cevabı iptal etmek üzereydim! –

+0

Bölüm 1'de bir şey ekledim OP'nin "loess.smooth" un neden gösterilen sorunla başarısız olduğu sorusu. –

0

Bu işlevlerle ilk kez karşılaştığımda, size bu konuda yardımcı olamadım, ancak bunun, y değerlerinde 0'lık bir varyansa sahip olmakla alakası olamaz mı? Böylece, zaten alır gibi pürüzsüz verilerden yumuşak bir çizgi tahmin etmeye çalışır ve bu çalışma yapar: part 1 için

x <- 0:50 
y <- c(rep(0,25),rep(1,26)) 
loess.smooth(x,y)