Les posteurs les plus actifs de la semaine
c@ssoulet
Construire boucle et fonction  Vote_lcapConstruire boucle et fonction  Voting_barConstruire boucle et fonction  Vote_rcap 


Construire boucle et fonction

Aller en bas

Construire boucle et fonction  Empty Construire boucle et fonction

Message par Komine le Mar 22 Fév 2011 - 8:34

Bonjour,
1 Boucle
Je m'initie aux boucles et fonctions. Pour m'exercer, j'ai voulu répéter le code suivant en 32 fois en variant la variable tablo$Date== 1 jusqu'à tablo$Date== 32.
Code:
mean(tablo[tablo$Date==1,][tablo[tablo$Date==1,]$Site==1,]$FMC)
J'ai essayé de faire cet exercice en essayant d'utiliser la boucle for:
Code:
for(i in 1:32){
a<-paste(mean(tablo[tablo$Date==1,][tablo[tablo$Date==1,]$Site==1,]$FMC))
print(a)
}
Cependant, j'ai comme résultat la moyenne de cette ligne qui est répétée 32 fois alors que je cherche à recopier le code 32 fois en variant tablo$Date de 1 à 32.
2 Fonction
Je veux créer une fonction faisant une régression multiple avec interaction, au cas où la P-value<0.05, faire le test de Shapiro, et un qqplot. Pour cela j'ai essayé d'écrire cette fonction:
Code:
reg<-function(X,Y,Z)
{
reg<-lm(X~Y+Z)
summary(reg)
if (p-value>0.05)stop
reg$res
shapiro.test(reg$res) 
qqnorm(reg$res)
return(reg)
}
Mais je n'ai ni un résultat, ni un message d'erreur.
Merci d'avance pour votre orientation.

Komine

Nombre de messages : 71
Date d'inscription : 02/06/2010

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Nik le Mar 22 Fév 2011 - 10:09

Salut,

C'est bien de ce lancer dans le bain de la "programmation" dans R Smile
Code:

for(i in 1:32){
a<-paste(mean(tablo[tablo$Date==1,][tablo[tablo$Date==1,]$Site==1,]$FMC))
print(a)
}
Cependant, j'ai comme résultat la moyenne de cette ligne qui est répétée 32 fois alors que je cherche à recopier le code 32 fois en variant tablo$Date de 1 à 32.
C'est normal ton "i" n'est attribué nulle part. Quand tu écris "for i in 1:32" il faut bien comprendre que tu crées une variable "i" de longueur 1 qui va varier de 1 à 32.
Donc pour calculer la moyenne en faisant varier la date, il faut bien que ton i figure dans ta variable que tu veux faire évoluer (ta date) et que les valeurs prises par ce "i" aient un sens pour ta variable date. Du coup il faut :
Code:
paste(mean(tablo[tablo$Date==i,][tablo[tablo$Date==1,]$Site==1,]$FMC))
Par ailleurs, si tu as 32 valeurs comme attendu c'est un peu un hasard dû au fait que tu as utilisé la fonction print() dans ta boucle donc il te l'affiche mais si tu voulais retrouver les 32 moyennes différentes tu t'apercevrais que ta boucle va te donner en résultat une seule et unique valeur qui sera la 32e moyenne car tu n'as pas lié ton "a" à la boucle du coup à chaque passage de la boucle la valeur du "a" du précédent passage est remplacée. Il faut faire :
Code:
a[i] <- paste(mean(tablo[tablo$Date==i,][tablo[tablo$Date==i,]$Site==1,]$FMC))

Et pour finir, il ne faut pas utiliser la fonction print dans ta boucle sauf si tu veux vraiment voir s'afficher les résultats au fur et à mesure des passages de la boucle.

Code:
a <- NULL #crée un vecteur vide où on peut mettre ce qu'on veut
for(i in 1:32){
a[i] <- paste(mean(tablo[tablo$Date==i,][tablo[tablo$Date==1,]$Site==i,]$FMC))
}

Dernière observation :
Code:
mean(tablo[tablo$Date==i,][tablo[tablo$Date==1,]$Site==1,]$FMC)
Cette sélection de valeur est vraiment très compliquée, je n'arrive même pas à comprendre ce que tu as voulu sélectionner (ne pas avoir les données sous les yeux est un gros handicap dans ce cas là : toujours présenter la structure de tes données pour avoir des réponses précises sous R)

Regarde l'aide de la fonction subset() ou encore with() pour éviter les sélection du type [xxx$YYY==Z]

Nik

Nik

Nombre de messages : 1605
Date d'inscription : 23/05/2008

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Komine le Mer 23 Fév 2011 - 9:41

Bonjour Nik,
Je vous remercie pour le message détaillé. Je vais aussi consulter l'aide indiquée.
Pour répondre à votre dernière interpellation, c'est vrai le code est compliqué et ce que je sélectionnais c'est FMC en fonction de la Date et du site 1.
Une partie de ma table:
Code:
 
              Site Date      FMC_mean EWT_mean FMC_sd EWT_sd Temp HR
1            1    1          164.30  264.60        36.3  63.3          45    28
2            1    2          149.40  226.70        33.0  65.3          36    46
3            1    3          144.90  168.10        28.0  54.1          38    45
4            1    4          111.10  130.60        28.2  32.4          38    36
5            1    5          109.80  144.90          12.5  52.8          43    29
J'ai essayé d'appliquer votre code ci-dessous mais le résultat ne sort pas.
Code:
a <- NULL #crée un vecteur vide où on peut mettre ce qu'on veut
for(i in 1:32){
a[i] <- paste(mean(tablo[tablo$Date==i,][tablo[tablo$Date==i,]$Site==1,]$FMC))
}

Certainement il ya une chose que je ne comprenne pas encore.
Merci encore

Komine

Nombre de messages : 71
Date d'inscription : 02/06/2010

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par A.D. le Mer 23 Fév 2011 - 10:08

Bonjour,

Je pense qu'avant de vouloir se lancer dans la création d'une boucle, il est préférable de tester si la formule écrite fonctionne pour le cas i=1.
J'ai utilisé le petit extrait du jeu de données que tu nous a fourni et j'ai simplement essayé de lancer la commande suivante dans R :

Code:
mean(tablo[tablo$Date==1,][tablo[tablo$Date==1,]$Site==1,]$FMC_mean)

Et cela ne fonctionne pas Neutral
D'ailleurs, tu as mis "$FMC" dans ton code alors que dans l'extrait de ton jeu de données aucune variable ne porte le nom "FMC"...

A mon avis, tu devrais essayer de procéder autrement pour ta sélection de variables (d'ailleurs que cherches-tu exactement à sélectionner?), peut-être en passant par les fonction que t'as suggéré Nik.

Bonne continuation,

A.D.

A.D.

Nombre de messages : 305
Age : 31
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Komine le Mer 23 Fév 2011 - 12:06

Bonjour A.D,
Merci pour l'intérêt que vous portez à ma question.
Vous avez raison, j'ai pas copié la bonne table, donc veuillez voir la table et le code utilisé pour calculer la première moyenne:
Code:
Site Parcelle Date  FMC    EWT
1      1        A    1      108.1  240
2      1        B    1      162.6  283
3      1        C    1      201.1  183
4      1        D    2      222.4  278
5      1        E    2      176.1  280
6      2        A    1      248.5  256
7      2        B    1      469.2  502
8      2        C    1      273.0  486
9      2        D    2      223.8  367
10    2        A    2      300.0  165

mean(tablo[tablo$Date==1,][tablo[tablo$Date==1,]$Site==1,]$FMC)
NB: je vais bien sure exploiter l'aide indiquer par Nik pour améliorer mes sélections de variables.
Merci encore

Komine

Nombre de messages : 71
Date d'inscription : 02/06/2010

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par A.D. le Mer 23 Fév 2011 - 12:11

Merci, cela fonctionne mieux avec ce jeu de données Very Happy

Personnellement, j'ai testé le code suivant :

Code:
a <- NULL #crée un vecteur vide où on peut mettre ce qu'on veut
for(i in 1:2){
a[i] <- paste(mean(tablo[tablo$Date==i,][tablo[tablo$Date==i,]$Site==1,]$FMC))
}

et cela fonctionn chez moi (NB: je n'ai fait tourner la boucle que pour i = 1 à 2 car dans l'extrait du jeu de données fourni il n'y a que les dates 1 et 2).

Cordialement,

A.D.

A.D.

Nombre de messages : 305
Age : 31
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Komine le Mer 23 Fév 2011 - 15:26

Bonjour
Je vous remercie A.D. et Nik pour vos orientations. Ma première boucle sur R marche en utilisant le code:

Code:
a <- NULL #crée un vecteur vide où on peut mettre ce qu'on veut
for(i in 1:32){
paste(mean(tablo[tablo$Date==i,][tablo[tablo$Date==i,]$Site==1,]$FMC))
a[i] <- paste(mean(tablo[tablo$Date==i,][tablo[tablo$Date==i,]$Site==1,]$FMC))
print(a[i])
}

Komine

Nombre de messages : 71
Date d'inscription : 02/06/2010

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Nik le Mer 23 Fév 2011 - 15:29

Salut,

le
Code:
print(a[i])

est inutile

cela permet juste d'afficher la valeur à l'écran mais pas de la récupérer.


Nik

Nombre de messages : 1605
Date d'inscription : 23/05/2008

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Komine le Mer 23 Fév 2011 - 17:04

Bonjour Nik,
En fait, sans le
Code:
print(a[i])
je ne voyais rien comme sortie de résultats et pour moi ça ne marchait pas.
Si je vous comprends bien il ya un autre moyen de récupérer les résultats sans les copier car moi je les copie de mon écran pour coller sur un fichier.
Merci

Komine

Nombre de messages : 71
Date d'inscription : 02/06/2010

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Nik le Jeu 24 Fév 2011 - 8:59

Pour afficher tes résultats dans la console il suffit de taper "a" puis valider et ça va t'afficher le contenu de l'objet a qui sera tes 32 valeurs.

Nik

Nik

Nombre de messages : 1605
Date d'inscription : 23/05/2008

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par droopy le Jeu 24 Fév 2011 - 9:13

Bonjour,

ici tu es typiquement dans le genre de cas ou une boucle ne sert à rien. Tu cherches à appliquer une fonction (la moyenne) à un objet (FMC) en fonction des modalités d'un facteur (Date) --> tapply.
Code:
a <- with(tab[tab$Site==1,], tapply(FMC, Date, mean))
# ou encore pour que ça soit plus simple à comprendre :
a <- tapply(tab$FMC[tab$Site==1], tab$Date[tab$Site==1], mean)
Quand on a la possibilité en R il vaut mieux éviter les boucles et vectoriser le calcul.
De même A.D quand on connait la longueur final du vecteur de résultat, ici a, il vaut mieux l'initialiser directement avec cette longueur plutôt que de l'initialiser avec NULL. Par exemple ici on peut mettre a <- numeric(2) et dans la boucle mettre a[i] <- ... Ça raccourcit le temps de calcul, puisque tu ne recrées pas à chaque itération de la boucle l'objet a. Sur des petits calculs comme celui-ci la différence n'est pas visible mais lorsque tu as une boucle assez grande alors la tu verras la différence.
droopy
droopy

Nombre de messages : 1129
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par A.D. le Jeu 24 Fév 2011 - 9:26

Merci pour la remarque droopy, c'est vrai que pour ce qui est du temps de calcul il est plus judicieux de créer initialement le vecteur à la taille souhaitée quand elle est connue.
Pour ma défense Wink , c'est d'ailleurs ce que je fais la plupart du temps, mais là j'avais juste copié-collé le code de Komine.

Cordialement,

A.D.

A.D.

Nombre de messages : 305
Age : 31
Localisation : Nantes
Date d'inscription : 02/12/2009

http://www.dacta.fr

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Nik le Jeu 24 Fév 2011 - 9:29

Rappelons que Komine débute et n'en est pas encore à optimiser ses temps de calcul Smile
Meme si l'exemple est mal choisi il faut bien comprendre comment marche les boucles Very Happy

Nik

Nombre de messages : 1605
Date d'inscription : 23/05/2008

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par droopy le Jeu 24 Fév 2011 - 9:39

Nik a écrit:Rappelons que Komine débute et n'en est pas encore à optimiser ses temps de calcul Smile
Meme si l'exemple est mal choisi il faut bien comprendre comment marche les boucles Very Happy
Je suis d'accord avec toi et justement autant prendre les bons réflexes dès le début ! C'est beaucoup plus simple ensuite de les avoir en tête, que ce soit avec l'utilisation de la boucle ou la non utilisation de la boucle.
droopy
droopy

Nombre de messages : 1129
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Nik le Jeu 24 Fév 2011 - 10:11

Si j'osais je te dirai de la boucler si tu me passes encore un de mes jeu de mot tout pourri !!!

Very Happy:D:D cheers cheers cheers

Nik

Nombre de messages : 1605
Date d'inscription : 23/05/2008

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par droopy le Jeu 24 Fév 2011 - 10:22

qu'est-ce que tu veux on peut pas toujours avoir raison, de plus il est meilleur que le steak haché ...
droopy
droopy

Nombre de messages : 1129
Date d'inscription : 04/09/2009

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Nik le Jeu 24 Fév 2011 - 10:39

e plus il est meilleur que le steak haché ...

Normal je m'améliore en vieillissant !

Que ceux qui ne comprennent rien se rassurent : on est en plein dans le message inutile de type défouloir Very Happy

Nik

Nombre de messages : 1605
Date d'inscription : 23/05/2008

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Komine le Jeu 24 Fév 2011 - 12:04

Bonjour,
Je note votre grand intérêt pour ma question. Je suis vraiment satisfait de vos réponses! J'ai connu R lors d'un court passage ne France mais je vois qu'il est à la fois difficile et intéressant.
Cordialement

Komine

Nombre de messages : 71
Date d'inscription : 02/06/2010

Revenir en haut Aller en bas

Construire boucle et fonction  Empty Re: Construire boucle et fonction

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum