dimanche 16 janvier 2011

Les distributions dans R

La distribution uniforme
runif : random uniform : renvoit une série de nombre aléatoire compris entre les limites d’un intervalle
Y=runif(100,-2,2)
Renvoie dans Y 100 nombres aléatoires compris entre -2 et 2. Les paramètres sont le nombre de nombre aléatoire et la taille de l'intervalle dans laquelle les données seront tirées. Remarquez la fréquence d'une distribution uniform vaut 1 dans l'intervalle [0,1] et 0 partout ailleurs.
runif(1,0,1) correspond à la fonction rand() des langages de programmation courant (une seule valeur sera rendue).

La distribution normale
rnorm : random normal : renvoit une série de nombre aléatoire suivant une distribution normale de moyenne u et d’écart type s. Attention il s'agit de l'écart type, pas de la variance.
X=rnorm(100,0,1)
Dans ce cas de figure on ne précise pas les limites max et min elles sont déterminées par la distribution de probabilité de la fonction normale répondant aux paramètres entrés.

dnorm : donne un vecteur contenenant les fréquences de cette distribution.
ex:
Y=dnorm(x)
plot(Y) affichera une gaussienne de moyenne 0 et d'écart type 1.

qnorm(p, mu,sigma): donne la valeur du quantile. Soit la proposition P(x<=xq)=p, qnorm donnera la valeur de xq en fonction de p.
Dans le même ordre d'idée pnorm(xq,mu,sigma) donnera la p-value associée à xq dans la proposition précédente. Ces fonctions sont très utiles pour les réaliser des tests d'hypothèses dont la variance de la population théorique est connue.
Dans le cas contraire (variance inconnue), il est toujours possible d'utiliser pt(xq,df).
df étant le degré de liberté (n-1) dans le cas d'un test t, avec n étant la taille de l'échantillon. On suppose bien sur que la statistique de test donnant xq est une statistique standardisée.

Autres distributions :binom, chisq (khi carré), lnorm (log normale), pois, t, weibul, wilcoxon

mardi 4 janvier 2011

Considérations sur MVC


MVC est un pattern définit par un Modèle, un Viewer et un Controller. Pour faire simple:

Le schéma n'est pas des mieux pour l'instant mais globalement, le controlleur s'occuppe des entrées utilisateurs (requête, update, ...)
Le controlleur va donc créer un Modèle qui sera utilisé pour alimenter le viewer.
Le modèle quant à lui s'occupe de différentes choses
- validation
- accès aux données
- business logic
- structure des données à afficher (présentation)
Le viewer quant à lui affiche les sorties (rendu). Notez toutefois que le viewer est un observeur du Modèle. Donc si le modèle change, le viewer est automatiquement notifié et prié de ce mettre à jour. Et ce sans l'intervention du contrôleur.

Cette description est très simplifiée mais elle donne une idée rapide de ce qu'est MVC. A ce pattern on peut retrouver différents framework associé tels que Spring par exemple qui est utilisé pour implémenter MVC dans des applications Java.

Nous avons vu que le modèle (M) permet l'accès aux données, pour se faire on peut aussi utiliser un framework tel que Doctrine qui permet de simplifier le mapping des classes sur des tables (il joue le rôle des DBObject dans TrialXS).
Doctrine est un framework qui implémente le pattern Active Record (cfr Folwer)
Le pattern active record présente un certain nombre de défaut:
- mal fichu pour des queries complexe
- à chaque nouvelle table il faut une nouvelle classe

Il est toutefois déconseiller de n'utiliser que Doctrine comme modèle car chaque fois que l'on va créer un nouveau controlleur il faudra définir dans le controlleur la manière dont les données sont liées, là on s'éloigne de la philosophie MVC car la collaboration d'objets pour réaliser une fonction doit se trouver dans le modèle.
Le modèle abstrait la manière dont les données sont liées entre elles en fournissant une interface de functionalités.

De plus Active Record expose les méthodes CRUD (Create Read Update Delete). Dans certains cas ça peut créer des racourcis funestes... En effet si par exemple ajouter un nouveau user implique de mettre à jour une table d'historique, le fait d'accéder directement à la table user peut ommettre cet update (si il n'y a pas de trigger sur la table user...).