Warum werfen diese Daten einen Fehler in R fitdistr?

7

Ich versuche, eine weibliche Verteilung darauf anzupassen, habe aber Probleme. Nicht sicher warum. Was verursacht die NaNs?

temp <- dput(temp)
c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22, 759.46, 
1142.33, 134, 1232.23, 389.81, 7811.65, 992.11, 1152.4, 3139.01, 
2636.78, 3294.75, 2266.95, 32.12, 7356.84, 1448.54, 3606.82, 
465.39, 950.5, 3721.49, 522.01, 1548.62, 2196.3, 256.8, 2959.72, 
214.4, 134, 2307.79, 2112.74)


fitdist(temp, distr = "weibull", method = "mle")
Fitting of the distribution ' weibull ' by maximum likelihood 
Parameters:
          estimate  Std. Error
shape    0.8949019   0.1205351
scale 1803.8816283 357.9042207
Warning messages:
1: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
2: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
3: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
4: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
5: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
6: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
7: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
8: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
9: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
10: In dweibull(c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22,  :
  NaNs produced
user1357015
quelle
4
Beide Parameter der Weibull-Verteilung sind positiv. Wenn Sie eingeben, werden fitdist(temp, distr = "weibull", method = "mle", lower = c(0, 0))keine Fehler erzeugt. Andernfalls werden optimnegative Werte versucht, die wiederum den Fehler erzeugen.
COOLSerdash
Vielen Dank! Warum wurden standardmäßig die folgenden Parameter ausprobiert? Ich würde davon ausgehen, dass der Weibull nur für positive Form- und Skalierungsparameter geeignet ist. Ebenso, was sollte das "niedrigere" für Gamma sein und woher weißt du das? Es ist nicht in? Fitdist dokumentiert.
user1357015
Obwohl dies eine Frage zum Verständnis einer R-Fehlermeldung ist (dh vermutlich außerhalb der Themenprogrammierung Q), scheint das zugrunde liegende Problem darin zu bestehen, die Art der Weibull-Verteilung zu verstehen. Daher kann es hier zum Thema sein.
Gung - Reinstate Monica
Aus welchem ​​Paket kommt die Funktion fitdist? Ich sehe fitdistrin MASS. CRAN kann bei der Paketbewertung ziemlich lasch sein.
AdamO
@COOLSerdash, da dies das Problem zu lösen scheint, warum nicht Ihren Kommentar in eine offizielle Antwort verwandeln (und ihn vielleicht ein bisschen erweitern)?
Gung - Reinstate Monica

Antworten:

18

Die Weibull-Verteilung hat zwei Parameter, die Skala und die Form (ich folge der Notation von Wikipedia). Beide Parameter sind positive reelle Zahlen.λk

Die Funktion fitdistaus dem fitdistrplusPaket verwendet die optimFunktion, um die Schätzungen der maximalen Wahrscheinlichkeit der Parameter zu ermitteln. Standardmäßig werden optimden Parametern keine Einschränkungen auferlegt und auch negative Zahlen ausprobiert. Negative Werte für die Skala oder Form ergeben jedoch NaNsfür die Weibull-Verteilung. Mit den Optionen lowerund upperkönnen Sie dem Parametersuchbereich für Grenzen setzen optim.

Die Gammaverteilung hat auch zwei Parameter und wie bei der Weibull-Verteilung sind beide positiv. Daher können die gleichen Grenzwerte lower = c(0, 0)für die Gammaverteilung verwendet werden.

Bearbeiten

Hier ist ein kleiner Vergleich der Weibull- und Gamma-Anpassung für die veröffentlichten Daten. Die Fehler für die Gammaverteilung entstehen durch schlechte Startwerte. Ich stelle sie manuell zur Verfügung und dann funktioniert es einwandfrei ohne Fehler.

library(fitdistrplus)

temp <- c(477.25, 2615.56, 1279.98, 581.57, 13.55, 80.4, 6640.22, 759.46, 
          1142.33, 134, 1232.23, 389.81, 7811.65, 992.11, 1152.4, 3139.01, 
          2636.78, 3294.75, 2266.95, 32.12, 7356.84, 1448.54, 3606.82, 
          465.39, 950.5, 3721.49, 522.01, 1548.62, 2196.3, 256.8, 2959.72, 
          214.4, 134, 2307.79, 2112.74)

fit.weibull <- fitdist(temp, distr = "weibull", method = "mle", lower = c(0, 0))
fit.gamma <- fitdist(temp, distr = "gamma", method = "mle", lower = c(0, 0), start = list(scale = 1, shape = 1))

Zeichnen Sie die Passform für den Weibull:

plot(fit.weibull)

Weibull fit

Und für die Gammaverteilung:

plot(fit.gamma)

Gamma fit

Sie sind praktisch nicht zu unterscheiden. Die AICs sind für beide Passungen praktisch gleich:

gofstat(list(fit.weibull, fit.gamma))

Goodness-of-fit statistics
                             1-mle-weibull 2-mle-gamma
Kolmogorov-Smirnov statistic    0.07288424  0.07970184
Cramer-von Mises statistic      0.02532353  0.02361358
Anderson-Darling statistic      0.20489012  0.17609146

Goodness-of-fit criteria
                               1-mle-weibull 2-mle-gamma
Aikake's Information Criterion      601.7909    601.5659
Bayesian Information Criterion      604.9016    604.6766
COOLSerdash
quelle
niedriger = c (0,0) verursacht jedoch Fehler ...
user1357015
@ user1357015 Wann ist der Fehler aufgetreten und was war er?
COOLSerdash
@COOLSerdah fitdist(temp, distr = "gamma", method = "mle", lower = c(0,0)) verursacht ein "Error in fitdist(splitData[[1]], distr = "gamma", method = "mle", lower = c(0, : the function mle failed to estimate the parameters, with the error code 100 Allerdings, wenn ich es einstelle c(0,1), funktioniert es aber gut.
user1357015
2
@ user1357015 Ich habe meine Antwort entsprechend aktualisiert. Der Fehler tritt aufgrund schlechter Startwerte auf.
COOLSerdash
1
Das klingt nach einer LOUSY-Funktion für den allgemeinen Gebrauch. Es wird mit einem Argument aufgerufen, das angibt, dass es sich um einen Webull handelt. Daher sollten meiner Meinung nach automatisch entsprechende Einschränkungen auferlegt werden. Ja, ich könnte das selbst tun, aber anstatt mir die Mühe zu machen, würde ich einen guten nichtlinearen Optimierer verwenden, der nicht auf MLE spezialisiert ist und wahrscheinlich viel besser als das, was Fitdist verwendet, und ich würde alle geeigneten Einschränkungen auferlegen mich in meiner Optimierungsproblemformulierung.
Mark L. Stone