Ho bisogno di smussare alcuni dati simulati, ma occasionalmente si imbattono in problemi quando le ordinate simulate da livellare sono per lo più lo stesso valore. Ecco un piccolo esempio riproducibile del caso più semplice.Errore nell'uso di `loess.smooth` ma non` loess` o `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)
, e il loro analogo in MATLAB produrre i risultati attesi senza errori su questo esempio. Sto usando loess.smooth
qui perché ho bisogno delle stime valutate a un determinato numero di punti. Secondo la documentazione, credo che loess.smooth
e loess
utilizzino le stesse funzioni di stima, ma il primo è una "funzione ausiliaria" per gestire i punti di valutazione. L'errore sembra provenire da una funzione 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
chiama anche simpleLoess
, ma con quello che sembra essere diversi argomenti. Ovviamente, se si varia il numero di valori y da zero diversi, loess.smooth
viene eseguito senza errori, ma è necessario che il programma venga eseguito anche nel caso più estremo.
Si spera, qualcuno mi può aiutare con uno e/o tutte le seguenti:
- Comprendere perché solo
loess.smooth
, e non le altre funzioni, produce questo errore e trovare una soluzione per questo problema. - Trovare un work-around usando
loess
ma ancora valutando la stima in un numero specificato di punti che possono differire dal vettore x. Ad esempio, potrei voler usare solox <- seq(0,50,10)
nel livellamento, ma valutare il preventivo ax <- 0:50
. Per quanto ne so, l'utilizzo dipredict
con una nuova cornice dati non gestirà correttamente questa situazione, ma per favore fatemi sapere se mi manca qualcosa lì. - Gestire l'errore in un modo che non impedisca al programma di passare al successivo set di dati simulato.
Grazie in anticipo per qualsiasi aiuto su questo problema.
eliminato la mia risposta, poiché è lo stesso che hai postato ora. –
@Joris - non è necessario averlo eliminato. Stavo per sviare la risposta! –
Ho aggiunto qualcosa nella parte 1 di t La domanda dell'OP sul perché 'loess.smooth' fallisce con il tipo di problema mostrato. –