Cours 5 Boucles, Programmation de base
Boucles et Tests for( in ) { } while( ) { } Exemple: x=rep(5,0) for (i in 1:5) x[i]=2*i+1 Les fonctions du type apply(),replicate() évitent d’écrire des boucles.
Boucles et exécutions conditionnelles if(expr1) expr2 else expr3 avec pour expr1 une expression de type logique, Remarques: Plusieurs commandes entre accolades: {expr;… ;expr n} Les exécutions conditionnelles (if.. else) peuvent quelquefois être remplacées efficacement par des indexations logiques.
Exemple: y=numeric(length(x)); for(i in 1:length(x)) {if(x[i]==b)y[i]=0 else y[i]=1} Remarque: L'exemple précédent peut être remplacé par: y[x==b]=0; y[x!=b]=1;
Des Expressions de type logique utilisant des opérateurs relationnels: x y;x =y;x==y; x!=y ou bien (et) les opérateurs NOT ! AND & OR I
if(expr1) expr2 else expr3 Le résultat de cette commande est expr2 si expr1 vaut TRUE et expr3 si expr1 vaut FALSE Il existe une version vectorisée de cette commande: ifelse(condition, a,b)
exemples x=1; if(x<5) y=1 else y=2 y; [1] 1 x=1:10 if(x<5) y=1 else y=2
Suite: ifelse(condition, a,b) ifelse(x<5,1,2) [1] y=ifelse(x<5,1,2);y; [1]
repeat expr while(condition) La commande break peut être utilisée pour terminer une boucle quelconque, et c’est le seul moyen pour interrompre une boucle avec repeat La commande next peut être utilisée pour pour interrompre une boucle particulière et passer aux instructions suivant next
Programmer avec R Point fort:la programmation d'une suite d'analyses qui seront exécutées successivement Un programme en R sera écrit dans un fichier ascii et sauvegardé avec l'extension.R Exemple: tracer le même graphe pour 3 espèces d'oiseaux
Programme 1 layout(matrix(1:3,3,1)) data=read.table(« swal.dat ») plot(data$v1,data$v2, type= »l ») Title(« swallow ») data=read.table(« wren.dat ») plot(data$v1,data$v2, type= »l ») Title(« wren ») data=read.table(« dunn.dat ») plot(data$v1,data$v2, type= »l ») Title(« dunn »)...
Programme 2:les noms de fichier et d'especes sont utilises comme des variables layout(matrix(1:3,3,1)) species=c(«swallow »,»wren »,»dunnock») file=c(« swal.dat »,»wren.dat »,»dunn.d at ») for(i in 1:length(species)) {data=read.table(file[i]) plot(data$v1,data$v2,type= »l ») title(species[i]) }
Les fonctions On peut écrire ses propres fonctions: Pour pouvoir être exécutée une fonction doit être chargée en mémoire, cela peut se faire de plusieurs façons: Entrer les lignes au clavier, ou les copier /coller à partir d’un éditeur Enregistrer la fonction dans un fichier ascii et la charger par la commande source() Si on souhaite que la fonction soit chargée au démarrage, il peut les enregistrer dans un workspace avec l’extension.Rdata qui sera chargé en mémoire s’il est localisé dans le répertoire de travail de démarrage getwd(): indique le repertoire de travail
Exemple de fonction carre=function(x){print(x*x)} carre(3);9 Il y a deux manières de spécifier les arguments à une fonction: par leur position par leur nom Exemple: fonc=function(arg1,arg2,arg3) fonc(x,y,z); fonc(arg2=y,arg1=x,arg3=z);
print() pour afficher le contenu d ’un objet dans une fonction Arguments par défaut Exemple: Moy.et.etype=function(x=1:10) {moyenne=mean(x); etype=sd(x); print(c(moyenne,etype)); } moy.et.etype() [1] moy.et.etype(1:100) [1]
Programme 3 myfun=function(S,F) { data=read.table(F) plot(data$v1,data$v2,type= »l ») title(S) }; layout(matrix(1:3,3,1) myfun(« swallow », »sawl.dat »)...
Les fonctions On peut écrire ses propres fonctions: Pour pouvoir être exécutée une fonction doit être chargée en mémoire, cela peut se faire de plusieurs façons: Entrer les lignes au clavier, ou les copier /coller à partir d’un éditeur Enregistrer la fonction dans un fichier ascii et la charger par la commande source() Si on souhaite que la fonction soit chargée au démarrage, on peut les enregistrer dans un workspace avec l’extension.Rdata qui sera chargé en mémoire s’il est localisé dans le répertoire de travail de démarrage getwd(): indique le repertoire de travail
nom=function(arg1,arg2,…)expression Où expression peut être un groupe d’expressions rassemblées entre accolades: nom=function(arg1,arg2,…) {expression1, expression2, expression3,… }
Fonctions (suite) print() pour afficher le contenu d ’un objet dans une fonction Le résultat de la fonction sera en général la dernière valeur calculée. Un appel de fonction est fait de la façon suivante: nom(arg1,arg2,…)
Exemples carre=function(x){print(x*x)} carre(3);9 Il y a deux manières de spécifier les arguments à une fonction: par leur position par leur nom fonc=function(arg1,arg2,arg3) fonc(x,y,z); fonc(arg2=y,arg1=x,arg3=z);
Arguments par défaut Exemple: moy.et.etype=function(x=1:10) {moyenne=mean(x); etype=sd(x); print(c(moyenne,etype)); } moy.et.etype() [1] moy.et.etype(1:100) [1]
Distributions de probabilités classiques shape,scale gammaGamma rate expExponentielle df,ncp chisqChi-Deux location, scale cauchyCauchy size,prob nbinomBinomiale négative size,prob binomBinomiale shape1,shape2,ncp beta Arguments additionnelsNoms sous Rdistributions
Distributions de probabilités classiques suite Arguments additionnelsNoms sous Rdistributions M,nwilcoxWilcoxon shape,scaleweibullWeibull min,maxunifUniforme df,ncptT de student lambdapoisPoisson mean,sdnormNormale meanlog,sdloglnormLog-normale n,m,khyperHypergéométrique probgeom Géométrique
Fonctions mathématiques de base Ecart-type des éléments de xsd(x) Matrice de corrélation si x est une matrice ou un data framecor(x) Variance des éléments de x(calculée sur n-1) matrice des var et cov si x est une matricevar(x) ou cov(x) Médiane des éléments de xmedian(x) Moyenne des éléments de xmean(x) Idem que c(min,max)range(x) Retourne l’indice du minimum des éléments de xwhich.min(x) Retourne l’indice du maximum des éléments de xwhich.max(x) Maximum, minimum des éléments de xmax(x), min(x) Produit des éléments de xprod(x) Somme des éléments de xsum(x)
Autres fonctions Retourne un vecteur de meme longueur que x contenant les éléments de x qui sont dans ymatch(x,y) Idem pour produit, minimum, maximumcumprod(), cummin(),cummax() Un vecteur dont le ieme élément est la somme de x[1]à x[i]cumsum(x) Un vecteur dont le iéme élément est le minimum entre x[i] et y[i]pmin(x,y,…) Centre et réduit les donnéesscale(x) Range les éléments de xrank(x) Trie les éléments de x dans l’ordre ascendantsort(x) Inverse l’ordre des éléments de xrev(x) Arrondit les éléments de x à n chiffres après la virguleround(x,n)
encore… Ré-échantillonnage aléatoire et sans remise de size éléments dans xsample(x,size) Retourne une selection de x en fonction de critèressubset() Retourne un tableau des effectifs des différentes valeurs de xtable() Si x est un vecteur ou un data frame, retourne un objet similaire mais avec les éléments duppliqués supprimésunique() Retourne un message d’erreur si x contient au moins un NAna.fail() Supprime les observations avec données manquantesna.omit() Coefficient binomial Cnkchoose(n,k)
La fonction which() which(x, arr.ind = FALSE) x: un vecteur ou tableau logique arr.ind: logique est-ce que les indices du tableau doivent être retournés lorsque x est un tableau? Exemple: m = matrix(12:24,3,4) ;m [,1] [,2] [,3] [,4] [1,] [2,] [3,]
which(m % 3 == 0) [1] which(m % 3 == 0, arr.ind=TRUE) row col [1,] 1 1 [2,] 1 2 [3,] 1 3 [4,] 1 4
Fonctions mathématiques de base Ecart-type des éléments de xsd(x) Matrice de corrélation si x est une matrice ou un data framecor(x) Variance des éléments de x(calculée sur n-1) matrice des var et cov si x est une matricevar(x) ou cov(x) Médiane des éléments de xmedian(x) Moyenne des éléments de xmean(x) Idem que c(min,max)range(x) Retourne l’indice du minimum des éléments de xwhich.min(x) Retourne l’indice du maximum des éléments de xwhich.max(x) Maximum, minimum des éléments de xmax(x), min(x) Produit des éléments de xprod(x) Somme des éléments de xsum(x)
Autres fonctions Retourne un vecteur de meme longueur que x contenant les éléments de x qui sont dans ymatch(x,y) Idem pour produit, minimum, maximumcumprod(), cummin(),cummax() Un vecteur dont le ieme élément est la somme de x[1]à x[i]cumsum(x) Un vecteur dont le iéme élément est le minimum entre x[i] et y[i]pmin(x,y,…) Centre et réduit les donnéesscale(x) Range les éléments de xrank(x) Trie les éléments de x dans l’ordre ascendantsort(x) Inverse l’ordre des éléments de xrev(x) Arrondit les éléments de x à n chiffres après la virguleround(x,n)
encore… Ré-échantillonnage aléatoire et sans remise de size éléments dans xsample(x,size) Retourne une selection de x en fonction de critèressubset() Retourne un tableau des effectifs des différentes valeurs de xtable() Si x est un vecteur ou un data frame, retourne un objet similaire mais avec les éléments duppliqués supprimésunique() Retourne un message d’erreur si x contient au moins un NAna.fail() Supprime les observations avec données manquantesna.omit() Coefficient binomial Cnkchoose(n,k)
Cours 7 Les régressions linéaires
Les analyses statistiques avec R Modèles linéaires,lm() modèles linéaires généralisés,glm() analyse de variance, aov()
généralités L ’argument principal est une formule du type: réponse ~ prédicteur exemples: data(I=InsectSprays) aov(sqrt(count) ~ spray,data=I) équivalent à : aov(sqrt(I$count) ~ I$spray) ou à aov(sqrt(I[,1]) ~ I[,2])
Les formules y~model ou y est la réponse analysée et model est un ensemble de termes pour lesquels les paramètres sont estimés attention: les symboles arithmétiques ont ici une signification particulière exemples: y~x1+x2 désigne le modèle y=ax1+bx2+c y~I(x1+x2) désigne le modèle y=a(x1+x2)+c y~poly(x,2) désigne le modèle y=ax^2+bx+c y~x1+x2 désigne le modèle y=ax1+bx2+c y~x1-1 désigne le modèle y=ax1
Les fonctions génériques Les objets qui contiennent les résultats d ’une analyse, ont un attribut particulier, la classe. Certaines fonctions, dites génériques, permettent d ’extraire des informations d ’un objet résultat exemples: summary()qui a une action différente sur un objet de classe lm(), aov(),...
apropos("^summary") [1] "summary.aov" "summary.aovlist" "summary.glm" [4] "summary.infl" "summary.lm" "summary.manova" [7] "summary.mlm" "summary.stepfun" "summaryRprof" [10] "summary" "summary.connection" "summary.data.frame" [13] "summary.Date" "summary.default" "summary.factor" [16] "summary.matrix" "summary.POSIXct" "summary.POSIXlt" [19] "summary.table"
Les fonctions génériques plot() print()résumé succint summary()résumé détaillé df.residualsnbre de ddl résiduels coefcoefficients estimés residualsrésidus deviancedéviance fittedvaleurs ajustées par le modèle logLiklogarithme de la vraisemblance...
Un objet-résultat, produit par aov(), lm()…. est généralement une liste,bien qu ’il ne soit pas affiché comme tel, dont les éléments peuvent être affiché par la fonction names() ex names(res.reg)pour une régréssion linéaire "coefficients" "residuals" "effects" "rank" "fitted.values" "assign" "qr" "df.residual" "xlevels" "call" "terms" "model"
Analyses supplémentaires à partir d ’un objet add1(): teste successivement tous les termes qui peuvent être ajoutés à un modèle drop1():teste successivement tous les termes qui peuvent être enlevés à un modèle anova(): calcule une table d ’analyse de variance ou de deviance pour un ou plusieurs modèles predict(): calcule les valeurs prédites pour des nouvelles données update(): réajuste un modèle...
Exemples de statistiques Exercice 1 : Dans une enquête sur les conditions de vie des ménages de banlieue, on dispose de la série statistique du nombre d’enfants de 10 ménages:
D=data.frame(men=1:11,nbenf=c(3,2,5,3,6,3,5,5,1,5,2));D; men nbenf
Calculer la moyenne du nombre d’enfants par ménage de deux façons différentes mean(D$nbenf); [1] sum(D$nbenf)/length(D$nbenf) [1]
Construire le tableau de la distribution des fréquences de cette série df=D$nbenf/sum(D$nbenf) > df [1]
Représenter graphiquement cette distribution. plot(table(D$nbenf),main="diagramme en batons des effectifs") plot(table(D$nbenf),main="polygone des effectifs ", type="b", col=2)
plot(table(D$nbenf)/length(D$nbenf),x lab="nombre d'enfants", ylab="frequence")
Exercice 2 : Au poste de péage, on compte le nombre de voitures se présentant sur une période de 5mn. Sur 100 observations de 5mn, on obtient les résultats suivants:...
Construire le diagramme en bâtons et le polygone des fréquences cumulées de la série du nombre de voitures. D1=data.frame(nv=1:12,no=c(2,8,1 4,20,19,15,9,6,2,3,1,1)) ● plot(D1$nv,D1$no,type="h", main="diagramme en batons",xlab="nombre de voitures", ylab="nombre d'observations")
Polygone des fréquences cumuléees ● fc=cumsum(no) plot(D1$nv,fc,type="l", main="polygone des frequences cumulées",xlab="nombre de voitures", ylab="frequences cumulees")
Calculer la moyenne et l’écart- type de cette série. (attention il s'agit de moyennes et d'ecart type pondérés) moy=sum(D1$nv*D1$no)/100 [1] 5.07 et=sqrt(sum(0.01*D1$no*(D1$nv- moy)^2)) > et [1]
Déterminer la médiane, les quartiles et tracer le box-plot. ● s=rep(D1$nv,D1$no);s summary(s) Min. 1st Qu. Median Mean 3rd Qu. Max boxplot(s)
Etudier la symétrie de la série calcul du moment d'ordre r r=2 mr=(sum(0.01*D1$no*(D1$nv- moy)^r))^(1/r): 2.18 r=3 mr=(sum(0.01*D1$no*(D1$nv- moy)^r))^(1/r) mr [1] r=4 [1]
Régréssion linéaire simple Sur des données fictives: x=1:100 x=sample(x,30,replace=TRUE) x [1] [26] y=3+7*x+rnorm(30,0,100) Y [1] [8] [15]
plot(x,y)
res.reg=lm(y~x); Call: lm(formula = y ~ x) Coefficients: (Intercept) x Droite de régression: y=6,71 *x
plot(x,y); abline(res.reg)
summary(res.reg) Residuals: Min 1Q Median 3Q Max Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) x e-11 Residual standard error: on 28 degrees of freedom Multiple R-Squared: , Adjusted R-squared: 0.78
Plus sophistiquée... La croissance d ’une bactérie (par jour), modélisé par N=N0 e^kt t=2:12; N=c(55,90,135,245,403,665,1100,1810,3000,4450,7350); Le modèle est le suivant;
t=c(2:12);N=c(55,90,135,245,403,665,1100,1810,3000,4450,7350) T=data.frame(t,N,y=log(N));T; > T t N y t N y …..
Calcul de moyenne et écart-type apply(T,2,mean); t N y apply(T,2,sd); t N y
plot(T$t,T$N)
plot(T$t,T$y)
droite de regression ll=lm(y~t,data=T);ll; Call: lm(formula = y ~ t, data = T) Coefficients: (Intercept) t
abline(ll);
summary(ll) Call: lm(formula = y ~ t, data = T) Residuals: Min 1Q Median 3Q Max Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) e-14 *** t e-15 *** --- Signif. codes: 0 `***' `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1
summary(ll) suite Residual standard error: on 9 degrees of freedom Multiple R-Squared: , Adjusted R-squared: F-statistic: 1.329e+04 on 1 and 9 DF, p-value: 1.413e-15
Régression linéaire multiple Exemples:
Les tests statistiques les test du chi-deux
La fonction chisq.test(x,y,logical,p) Premier exemple: on lance un dé 300 fois et on obtient le résultat suivant: x=c(43, 49, 56, 45, 66, 41) prob=rep(1/6,6) chisq.test(x,p=prob) Chi-squared test for given probabilities data: x X-squared = 8.96, df = 5, p-value =
Second exemple sur un tableau de contingence Exemple d ’un tableau donnant la cécité en fonction du sexe: tab=matrix(c(442,514,38,6),nrow=2,byrow=TRUE) colnames(tab)=c("homme","femme") rownames(tab)=c("voyant","aveugle") homme femme voyant aveugle 38 6
X2=chisq.test(tab,correct=FALSE) On teste s ’il y a une relation entre sexe et cécité (l ’hypothèse par défaut est celle d ’indépendance) Pearson's Chi-squared test data: tab X-squared = , df = 1, p-value = 1.894e-07
attributes(x2) $names [1] "statistic" "parameter" "p.value" "method" "data.name" "observed" [7] "expected" "residuals" $class [1] "htest » par exemple:
x2$expected homme femme voyant aveugle valeurs attendues sous hypothèse d ’indépendance x2$residuals homme femme voyant aveugle sum(x2$residuals^2) la somme des carrés des résidus est la valeur du chi-deux
Soit le tableau de contingence suivant: roux blond brun bleu marron le test du chi-deux d ’indépendance s ’effectue ainsi: chisq.test(m)
Pearson's Chi-squared test data: m X-squared = , df = 2, p-value = on teste l ’hypothèse nulle suivante « H0:il y a indépendance entre la couleur des yeux et celle des cheveux »
Test sur une moyenne: prop.test() Pour comparer deux ou plusieurs proportions sur des échantillons de grande taille: prop.test(x, n, p = NULL,alternative = c("two.sided", "less", "greater"), conf.level = 0.95, correct = TRUE)
Classification
La fonction kmeans() Méthodes de type « nuées dynamiques »: on suppose que les individus sont des points de R^n muni de la distance euclidienne On recherche un partitionnement des individus en classes Variance des classes minimale (classes homogènes) Variance entre classes maximale Rappel : théorème de Huygens: la somme de l ’inertie interclasse et de l ’inertie intraclasse est constante (inertie = moyenne des carrés des distances au centre de gravité)
suite Exemple en dimension 2 sur le dataframe D PROB LECT CARR OPER SYNO PFB SUITE ANAL D70 T M s E=D[,c(1,2)] cl <- kmeans(E, 4, 20) (donne 4 sous-nuages) plot(E, col = cl$cluster) (tracé pour un objet de type résultat de la fct kmeans) points(cl$centers, col = 1:4, pch = 8)
Autre exemple data(airquality); a=airquality [,3:4] cl=kmeans(a,3,20) plot(a, col = cl$cluster) ;points(cl$centers, col = 1:4, pch = 8)
le résultat de la fct kmeans est une liste contenant :les composants suivants: cluster: un vecteur d’entiers indiquant la partition ( le sous-nuage) à laquelle est affecté chaque point centers: la matrice des centres des sous-nuages withinss: The within-cluster sum of squares for each cluster. size: le nombre de points dans chaque sous-nuage
La fonction hclust()
La fonction cutree()