J’utilise Distribution dans la plupart de mes applications mais je ne lui laisse pas exprimer son plein potentiel, et celui du package distribution. j’ai donc souhaité créer une application entièrement dédiée à ces outils.
L’outil
Ici l’utilisateur peut uploader le dataset de son choix. choix Une liste déroulante des différentes colonnes sera disponible pour qu’il puisse en visualiser la distribution.
Julia va ensuite fit la colonne selectionée par l’utilisateur a un grand nombre de lois pré-enregistrées. On va ensuite calculer le critère d’information d’Akaike avec la formule suivante:
\[AIC = 2k - 2l + \frac{2k^2 + 2k}{n - k - 1} \]
Où:
- k: nombre de parametre du modèle
- n: taille du dataset
- l: logvraissemblance de l'échantillon par rapport à la loi considérée
Le troisième terme est une pénalité sur la taille de la série considérée, car pour des petites séries, AIC va avoir tendance à sélectionner des modèles à nombreux paramètres.
L’application va lui plotter la densité de la distribution correspondante au modèle le plus adapté, Et on plottera également la distribution liée au modèle non paramétrique de la méthode des noyaux.
Code
usingDataFramesusingRDatasetsusingStatsPlotsusingDistributionsfunctionakaike_estimate(v::Array, d) l,k =log_vraisemblance(v,d)# Pour les petits datasets AIC va selectioner les lois a plusieurs parametres# On prévient l'overfitting en ajoutant un correcteur (qui sannule si n grand) correcteur = (2k^2+2k) / (length(v) - k -1)return2*k -2*l + correcteurendfunctionlog_vraisemblance(v,d)# retourne: [log-vraisemblance, nbparams] loi = try fit(d ,v) catch eprintln("probleme de support")println(e)0endif loi ==0return [99^100,1]elseprintln("loi $(loi)")# ll calculée a la main: temp = logpdf.(loi,v) |> sum temp =loglikelihood(loi,v)if temp ==-Infreturn [99^100,1]endreturn [temp, length(params(loi))]endendfunctionget_errors(v::Array) dist_list = [ Normal, Beta, Exponential, Cauchy,#Poisson, Gamma, Laplace, Rayleigh, Uniform] akaike_list = [akaike_estimate(v,d) for d in dist_list] df =DataFrame( Distributions = dist_list,#erreur = erreur_liste, akaike_estimate = akaike_list )sort!(df,[order(:akaike_estimate, rev =false)])return dfendiris =dataset("datasets", "iris")data = iris.SepalLengthtab_akaike =get_errors(data)l =fit(tab_akaike[1,1],data)l2 =fit(Normal,data)b_inf =minimum(data) b_sup =maximum(data)
---title: "Fit et selection de modèle"format: html: code-fold: true---# MotivationJ'utilise Distribution dans la plupart de mes applications mais je ne lui laisse pas exprimerson plein potentiel, et celui du package distribution. j'ai donc souhaité créer une application entièrement dédiéeà ces outils. # L'outil Ici l'utilisateur peut uploader le dataset de son choix. choixUne liste déroulante des différentes colonnes sera disponible pour qu'il puisse en visualiser la distribution. Julia va ensuite fit la colonne selectionée par l'utilisateur a un grand nombre de lois pré-enregistrées. On va ensuite calculer le critère d'information d'Akaike avec la formule suivante:$$AIC = 2k - 2l + \frac{2k^2 + 2k}{n - k - 1} $$Où: - k: nombre de parametre du modèle - n: taille du dataset - l: logvraissemblance de l'échantillon par rapport à la loi considéréeLe troisième terme est une pénalité sur la taille de la série considérée, car pour des petites séries,AIC va avoir tendance à sélectionner des modèles à nombreux paramètres.L'application va lui plotter la densité de la distribution correspondante au modèle le plus adapté,Et on plottera également la distribution liée au modèle non paramétrique de la méthode des noyaux.```{julia}#| output: falseusing DataFramesusing RDatasetsusing StatsPlotsusing Distributionsfunction akaike_estimate(v::Array, d) l,k = log_vraisemblance(v,d)# Pour les petits datasets AIC va selectioner les lois a plusieurs parametres# On prévient l'overfitting en ajoutant un correcteur (qui sannule si n grand) correcteur = (2k^2 + 2k) / (length(v) - k - 1)return2*k - 2*l + correcteurendfunction log_vraisemblance(v,d)# retourne: [log-vraisemblance, nbparams] loi = try fit(d ,v) catch e println("probleme de support") println(e)0 endif loi == 0return [99^100,1]else println("loi $(loi)")# ll calculée a la main: temp = logpdf.(loi,v) |> sum temp = loglikelihood(loi,v)if temp == -Inf return [99^100,1] endreturn [temp, length(params(loi))] endendfunction get_errors(v::Array) dist_list = [ Normal, Beta, Exponential, Cauchy,#Poisson, Gamma, Laplace, Rayleigh, Uniform] akaike_list = [akaike_estimate(v,d) for d in dist_list] df = DataFrame( Distributions = dist_list,#erreur = erreur_liste, akaike_estimate = akaike_list )sort!(df,[order(:akaike_estimate, rev =false)])return dfendiris = dataset("datasets", "iris")data = iris.SepalLengthtab_akaike = get_errors(data)l = fit(tab_akaike[1,1],data)l2 = fit(Normal,data)b_inf = minimum(data) b_sup = maximum(data) ``````{julia}tab_akaike``````{julia}using KernelDensityx = range(b_inf,b_sup,200)histogram(data, bins = 25, normalize = true, size = (1000,850), label = "Distribution sepal length")plot!(x,pdf.(l,x), label = "Meilleur fit $(tab_akaike[1,1]) $(round.(params(l)))", lw = 3)plot!(range(b_inf, b_sup, length =length(kde(data).density)), kde(data).density, label = "Densité des noyaux", lw = 3)```