Calcul du taux de croissance et centrer réduire

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Coralie Deniot
Messages : 20
Enregistré le : 04 Nov 2015, 08:09

Calcul du taux de croissance et centrer réduire

Messagepar Coralie Deniot » 26 Juil 2017, 09:22

Bonjour à tous !

Me revoilà pour une nouvelle question, un peu moins difficile normalement. Merci à tous ceux qui m'aideront :)

Ma question est: Comment calculer le taux de croissance et le centrage réduit de mes données?

DESCRIPTION DU JEU DE DONNÉES:
4 colonnes
-Nom de l'individu (il y a 20 individus qui sont des ruches)
-Poids de l'individu (on pèse des ruches)
-Température extérieur (on mesure la température extérieure)
-Date et heure du relevé des données Poids et Température
(Voir un modèle du tableau de données brut dans le code ci dessous)

Code : Tout sélectionner

nom <- c(rep("individu1", 5), rep("individu2", 5))
date.heure <- as.POSIXct(
  c("01/01/2017 8:00:00", "01/01/2017 8:10:00", "01/01/2017 8:25:00",
    "01/01/2017 8:30:00", "01/01/2017 9:10:00", "01/01/2017 8:30:00",
    "01/01/2017 8:40:00", "01/01/2017 9:00:00", "01/01/2017 9:10:00",
    "01/01/2017 9:22:00"),
  format = "%d/%m/%Y %H:%M:%S"
)
poids <- c(20, 20.5, 22, 21, 30, 30, 30.5, 32, 31, 31.5)
temperature <- c(15, 16, 20, 18, 26, 20, 21, 22.5, 25, 24)
tab <- data.frame(nom, date.heure, poids, temperature)


QUESTION: CALCUL DU TAUX DE CROISSANCE ET CENTRER RÉDUIRE LE POIDS
J'aimerais rajouter 2 colonnes :
-Une colonne qui calcule le taux de variation du poids: tx.crois = ( (poids à date.heure 1) - (poids à date.heure 0) ) / (poids à date.heure 0)
-Une colonne qui calcule le poids centré réduit par individu
NB: Je rappelle qu'il y a 20 individus
(Voir un modèle du tableau final souhaité dans le code ci dessous)

Code : Tout sélectionner

nom <- c(rep("individu1", 5), rep("individu2", 5))
date.heure <- as.POSIXct(
  c("01/01/2017 8:00:00", "01/01/2017 8:10:00", "01/01/2017 8:25:00",
    "01/01/2017 8:30:00", "01/01/2017 9:10:00", "01/01/2017 8:30:00",
    "01/01/2017 8:40:00", "01/01/2017 9:00:00", "01/01/2017 9:10:00",
    "01/01/2017 9:22:00"),
  format = "%d/%m/%Y %H:%M:%S"
)
poids <- c(20, 20.5, 22, 21, 30, 30, 30.5, 32, 31, 31.5)
temperature <- c(15, 16, 20, 18, 26, 20, 21, 22.5, 25, 24)
tx.crois <-c("a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer")
CR <-c("a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer", "a calculer")
tab <- data.frame(nom, date.heure, poids, temperature, tx.crois, CR)


==> Le but de cette manipulation est ensuite de faire une régression linéaire
-du taux d'accroissement du poids en fonction de la température
-du poids centré réduit en fonction de la température.


Merci beaucoup pour votre aide, et surtout n'hésitez pas si vous avez besoin d'informations supplémentaires ! C'est avec plaisir :)

Coralie

Charles Marcucci
Messages : 52
Enregistré le : 13 Juil 2016, 09:00

Re: Calcul du taux de croissance et centrer réduire

Messagepar Charles Marcucci » 26 Juil 2017, 09:35

Bonjour

Pour résoudre ce problème je commencerai par rajouter des colonnes

Code : Tout sélectionner

tab[,5]<-NA
tab[,6]<-NA


puis je leurs donne un nom

Code : Tout sélectionner

names(tab)[5:6]<-c("tx.crois","CR")


j'utilise une boucle for pour calculer le poids ainsi que le poids centre reduit mais quand vous dite poids à date.heure 0 c'est pour tous la même référence ? c'est à dire pour individus 1 "01/01/2017 8:00:00" ?
quelle est la formule du poids centre réduit ?

Cordialement

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Calcul du taux de croissance et centrer réduire

Messagepar Serge Rapenne » 26 Juil 2017, 10:10

Bonjour,

Pour le taux de croissance, tu peux faire comme çà :

Code : Tout sélectionner

library(dplyr)
tab<-tab %>% group_by(nom) %>% mutate(tx.crois=(poids-lead(poids))/poids)


pour le poids centré réduit par individu, je sèche

Serge

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Calcul du taux de croissance et centrer réduire

Messagepar Pierre-Yves Berrard » 26 Juil 2017, 10:14

Bonjour,

Je complète la réponse de Serge :

Code : Tout sélectionner

tab %>%
  group_by(nom) %>%
  mutate(
    poids_tx.crois = poids / lag(poids) - 1,
    poids_CR = scale(poids)
  )
PY

Charles Marcucci
Messages : 52
Enregistré le : 13 Juil 2016, 09:00

Re: Calcul du taux de croissance et centrer réduire

Messagepar Charles Marcucci » 26 Juil 2017, 10:14

Du coup je suis parti de ce que j'ai compris de l'énnoncé et j'ai fait ce petit bout de code

Code : Tout sélectionner

nom <- c(rep("individu1", 5), rep("individu2", 5))
date.heure <- as.POSIXct(
  c("01/01/2017 8:00:00", "01/01/2017 8:10:00", "01/01/2017 8:25:00",
    "01/01/2017 8:30:00", "01/01/2017 9:10:00", "01/01/2017 8:30:00",
    "01/01/2017 8:40:00", "01/01/2017 9:00:00", "01/01/2017 9:10:00",
    "01/01/2017 9:22:00"),
  format = "%d/%m/%Y %H:%M:%S"
)
poids <- c(20, 20.5, 22, 21, 30, 30, 30.5, 32, 31, 31.5)
temperature <- c(15, 16, 20, 18, 26, 20, 21, 22.5, 25, 24)
tab <- data.frame(nom, date.heure, poids, temperature)

tab[,5]<-NA
tab[,6]<-NA
names(tab)[5:6]<-c("tx.crois","CR")


#### calcule du CR.poids####"
poids.ref<-0
for (i in 2:nrow(tab))
{
  print (i)
  if (i==2)
  {
      poids.ref<-tab$poids[i-1]
      tab$tx.crois[i]<-((tab$poids[i]-poids.ref)/poids.ref)
       tab$tx.crois[i-1]<-0
  }
  else if (tab$nom[i]!=tab$nom[i-1])
  {
    poids.ref<-tab$poids[i]
    tab$tx.crois[i]<-0
  }
  else
  {tab$tx.crois[i]<-((tab$poids[i]-poids.ref)/poids.ref)}
 
}

#####variable centre reduite####
individue<-unique(tab$nom)
nb_individue<-length(unique(tab$nom))
ligne<-1

for (i in 1:nb_individue)
{
  boucle<-length(which(tab$nom==individue[i]))
 
  for(j in 1:boucle)
    {
  moyenne<-mean(tab$poids[which(tab$nom==individue[i])])
  sd<-sd(tab$poids[which(tab$nom==individue[i])])
  tab$CR[ligne]<-((tab$poids[ligne]-moyenne)/sd)
  ligne<-ligne+1
  }
 
 
}


en espérant que ce soit ce qui est demandé

Cordialement

Coralie Deniot
Messages : 20
Enregistré le : 04 Nov 2015, 08:09

Re: Calcul du taux de croissance et centrer réduire

Messagepar Coralie Deniot » 26 Juil 2017, 11:33

Merci pour vos nombreuses aides !

Il y a un petit couac. En effet comme vous l'aurez remarqué la mesure du poids n'est pas régulière et on peu avoir un intervalle de 10 min comme de 15 min ou 30 entre les différents relevés. Du coup dans le calcul du taux de variation, il faut prendre en compte cela. Il faut calculer le taux de variation du poids en fonction de intervalle temps entre les deux relevés.

Exemple pour la deuxième ligne (la première étant "NA"):
tx.croiss = (20,5 - 20 )/20 en prenant en compte que c'est en 10min (de 8:00:00 à 8:10:00).


Est-ce que cela est compréhensible pour vous?

Merci encore, je reste sur mon ordinateur désormais et regarde vos réponses avec vous.

PS: Charles, je n'ai pas encore essayé la boucle for. mon tableau fait 600 000 lignes et j'ai peur que l'utilisation d'une boucle for ne soit pas très optimum ... qu'en penses tu? :)

Coralie

Charles Marcucci
Messages : 52
Enregistré le : 13 Juil 2016, 09:00

Re: Calcul du taux de croissance et centrer réduire

Messagepar Charles Marcucci » 26 Juil 2017, 11:49

Voici mon code modifié pour avec la difference de poids en Kg par minute.

Pour la boucle for moi j'utilise ça sur un tableau de 150 000 lignes et ça passe.
Mais les solutions de mes collègues sont beaucoup plus jolie et moins gourmandes en ressource que la mienne.

Code : Tout sélectionner

nom <- c(rep("individu1", 5), rep("individu2", 5))
date.heure <- as.POSIXct(
c("01/01/2017 8:00:00", "01/01/2017 8:10:00", "01/01/2017 8:25:00",
"01/01/2017 8:30:00", "01/01/2017 9:10:00", "01/01/2017 8:30:00",
"01/01/2017 8:40:00", "01/01/2017 9:00:00", "01/01/2017 9:10:00",
"01/01/2017 9:22:00"),
format = "%d/%m/%Y %H:%M:%S"
)
poids <- c(20, 20.5, 22, 21, 30, 30, 30.5, 32, 31, 31.5)
temperature <- c(15, 16, 20, 18, 26, 20, 21, 22.5, 25, 24)
tab <- data.frame(nom, date.heure, poids, temperature)

tab[,5]<-NA
tab[,6]<-NA
names(tab)[5:6]<-c("tx.crois","CR")


#### calcule du CR.poids####"
for (i in 2:nrow(tab))
{
  print (i)
  if (i==2)
  {
  tab$tx.crois[i]<-(((tab$poids[i]-tab$poids[i-1])/tab$poids[i-1])/as.numeric(difftime(tab$date.heure[i],tab$date.heure[i-1],units="mins")))
  tab$tx.crois[i-1]<-0
  }
  else if (tab$nom[i]!=tab$nom[i-1])
  {
  tab$tx.crois[i]<-0
  }
  else
  {tab$tx.crois[i]<-(((tab$poids[i]-tab$poids[i-1])/tab$poids[i-1])/as.numeric(difftime(tab$date.heure[i],tab$date.heure[i-1],units="mins")))}
 
}

#####variable centre reduite####
individue<-unique(tab$nom)
nb_individue<-length(unique(tab$nom))
ligne<-1
.
for (i in 1:nb_individue)
{
  boucle<-length(which(tab$nom==individue[i]))
 
  for(j in 1:boucle)
  {
  moyenne<-mean(tab$poids[which(tab$nom==individue[i])])
  sd<-sd(tab$poids[which(tab$nom==individue[i])])
  tab$CR[ligne]<-((tab$poids[ligne]-moyenne)/sd)
  ligne<-ligne+1
  }
 
 
}


sinon pour reprendre la solution de Pierre-Yves Berrard

Code : Tout sélectionner

tab<-tab %>%
  group_by(nom) %>%
  mutate(
    poids_tx.crois = (poids / lag(poids) - 1)/as.numeric(difftime(date.heure,lag(date.heure)-1,units="mins")),
    poids_CR = scale(poids)
  )

Coralie Deniot
Messages : 20
Enregistré le : 04 Nov 2015, 08:09

Re: Calcul du taux de croissance et centrer réduire

Messagepar Coralie Deniot » 26 Juil 2017, 12:22

Cela fonctionne !!

Un grand merci à vous, merci Charles pour ce retour :)

En espérant encore travailler avec vous!

Au plaisir,

Coralie

Charles Marcucci
Messages : 52
Enregistré le : 13 Juil 2016, 09:00

Re: Calcul du taux de croissance et centrer réduire

Messagepar Charles Marcucci » 26 Juil 2017, 12:32

mais de rien.

Il faut surtout remercier Pierre-Yves Berrard et Serge Rapenne qui maitrisent bien le package dplyr evitant ainsi des 10aine de ligne de code.

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Calcul du taux de croissance et centrer réduire

Messagepar Serge Rapenne » 26 Juil 2017, 12:36

Juste une petite remarque complémentaire pour ajouter un peu de sécurité au code.

Notre code ne va être correcte uniquement si les identifiants et les dates sont bien ordonnés. Pour s'assurer de cela, il suffit de modifier le code comme suit.

Code : Tout sélectionner

tab<-tab %>% arrange(nom,date.heure) %>%
  group_by(nom) %>%
  mutate(
    poids_tx.crois = (poids / lag(poids) - 1)/as.numeric(difftime(date.heure,lag(date.heure)-1,units="mins")),
    poids_CR = scale(poids)
  )


Serge

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Calcul du taux de croissance et centrer réduire

Messagepar Pierre-Yves Berrard » 26 Juil 2017, 13:05

Charles Marcucci a écrit :

Code : Tout sélectionner

tab<-tab %>%
  group_by(nom) %>%
  mutate(
    poids_tx.crois = (poids / lag(poids) - 1)/as.numeric(difftime(date.heure,lag(date.heure)-1,units="mins")),
    poids_CR = scale(poids)
  )


Pourquoi -1 après lag(date.heure) ?
PY

Charles Marcucci
Messages : 52
Enregistré le : 13 Juil 2016, 09:00

Re: Calcul du taux de croissance et centrer réduire

Messagepar Charles Marcucci » 26 Juil 2017, 13:09

pour avoir la date et l'heure de la ligne d'avant.
Comme pour le
lag(poids) - 1


En enlevant le -1 je n'avais pas les même résultat que mes boucles.

Est-ce une erreur ?
je ne voyait pas comment accéder à la différence d'heure sinon.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Calcul du taux de croissance et centrer réduire

Messagepar Pierre-Yves Berrard » 26 Juil 2017, 13:28

Charles Marcucci a écrit :pour avoir la date et l'heure de la ligne d'avant.

Récupérer la valeur de la ligne d'avant, c'est le boulot de la fonction lag.
(poids / lag(poids) - 1 signifie retirer 1 au coefficient multiplicateur poids / lag(poids))

Du coup, en prenant en compte la remarque de Serge sur le tri, on aboutit à :

Code : Tout sélectionner

res <-
  tab %>%
  arrange(nom, date.heure) %>%
  group_by(nom) %>%
  mutate(
    poids_tx.crois = (poids / lag(poids) - 1) / as.numeric(difftime(date.heure, lag(date.heure), units = "mins")),
    poids_CR = scale(poids)
  )
PY

Charles Marcucci
Messages : 52
Enregistré le : 13 Juil 2016, 09:00

Re: Calcul du taux de croissance et centrer réduire

Messagepar Charles Marcucci » 26 Juil 2017, 13:35

Ok désole alors

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Calcul du taux de croissance et centrer réduire

Messagepar Serge Rapenne » 26 Juil 2017, 13:37

Bonjour Pierre-Yves,

je me posais d’ailleurs la question du pourquoi de ce -1 sur (poids / lag(poids) - 1)

Serge


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité