2016-10-11 1 views
1

je les données suivantesFit distribution triangulaire

dat<-c(16.254884, 14.077510, 12.851675, 19.152597, 11.511230, 
    16.122911, 16.099962, 9.670949, 12.523661, 15.257432, 13.603848, 
    14.118873, 12.632340, 15.413753, 5.426383, 11.369880, 12.895920, 
    13.635134, 15.118388,13.154107, 8.913164, 17.302810, 14.968054, 
    16.200151, 16.068944, 18.571952, 15.247535, 15.018281) 

J'utilise ce code pour trouver le mode:

Mode_fc <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

En utilisant MyParam, je suis en mesure d'obtenir le min, max et le mode

MyParam <- c(min= min(dat), max= max(dat), mode= Mode_fc(dat)) 

Lorsque j'entre ces valeurs dans le code ci-dessous fitdist fonctionne comme prévu

fitdist(dat, "triang", start = list(min=5.4, max=19.2, mode=16.3)) 

Mais, quand j'essaie de lire dans MyParam je reçois toutes sortes d'erreurs

fitdist(dat, "triang", 
start = list(min=MyParam[[1]], max=MyParam[[2]], mode=MyParam[[3]])) 

Je sais que la question est avec optim(), mais je ne l'ai pas été en mesure de comprendre comment résoudre ce problème problème. Toutes les suggestions sont appréciées!

+0

D'où avez-vous eu 'dtriang'? 'bibliothèque (sos); findFn ("dtriang") 'en trouve quelques-uns, mais j'ai encore besoin de trouver celui avec les mêmes arguments que vous citez ... –

Répondre

1

Votre problème (certes assez subtile) est que la probabilité de données sous la distribution triangulaire est égale à zéro (et donc le log-vraisemblance est infini négatif) si l'une des données sont à l'extérieur, ou sur le limites de, la distribution. Illustration:

library(fitdistrplus) 
library(mc2d) ## needed for dtriang 

Essayer les crises (comme dans votre exemple ci-dessus):

L1 <- list(min=5.4, max=19.2, mode=16.3) 
fitdist(dat, "triang", start = L1) ## works 
L2 <- list(min=MyParam[[1]], max=MyParam[[2]], mode=MyParam[[3]]) 
fitdist(dat, "triang", start = L2) ## fails 

Brisons ce un peu et voir ce que les log-vraisemblances réels sont pour chaque ensemble de paramètres:

do.call(dtriang,c(list(x=dat,log=TRUE),L1)) 
## [1] -1.935669 -2.159550 -2.311845 -6.045302 -2.510156 -1.947902 -1.950044 
## [8] -2.868448 -2.356862 -2.032059 -2.215681 -2.154794 -2.341722 -2.016325 
## [15] -7.955320 -2.533557 -2.305925 -2.211875 -2.046264 -2.272062 -3.063767 
## [22] -2.355858 -2.061854 -1.940724 -1.952947 -3.461371 -2.033063 -2.056619 

Toutes les valeurs finies.

(test2 <- do.call(dtriang,c(list(x=dat,log=TRUE),L2))) 
## [1] -1.926160 -2.150652 -2.303450  -Inf -2.502540 -1.938423 -1.940570 
## [8] -2.862702 -2.348631 -2.022796 -2.206960 -2.145882 -2.333434 -2.007021 
## [15]  -Inf -2.526044 -2.297509 -2.203141 -2.037041 -2.263528 -3.059363 
## [22] -2.375012 -2.052673 -1.931228 -1.943481 -3.533698 -2.023803 -2.047423 

Deux valeurs infinies, qui correspondent aux valeurs min et max.

which(!is.finite(test2)) ## 4 15 
which.min(test2) ## 4 
which.max(test2) ## 5 

On peut facilement contourner ce problème en tordant le minimum un peu et au maximum un peu des valeurs observées:

eps <- 0.100 
L3 <- list(min=MyParam[[1]]-eps, max=MyParam[[2]]+eps, mode=MyParam[[3]]) 
fitdist(dat, "triang", start = L3) 

Cela fonctionne très bien.

+0

Brillant! Cela a fonctionné parfaitement. – ACBe

-1

Vous devez utiliser un [] et non [[]] pour sous-totaliser les valeurs minimum et maximum de MyParam.

fitdist(dat, "triang", start = list(min=MyParam[1], max=MyParam[2], mode=MyParam[3])) 
+0

Même après avoir remplacé [[]] par [], MyParam n'est toujours pas passé correctement – ACBe