2 votes

Comment calculer l'heure moyenne d'un événement ?

Je dispose de données à différentes dates et je souhaite connaître l'heure moyenne (médiane ou moyenne) à laquelle les événements se produisent. Le problème est que les moyennes normales ne fonctionnent pas ici car le temps est circulaire (par exemple, 1 vient après 24). Par exemple, la moyenne de 23 heures et de 1 heure du matin devrait être minuit, mais la fonction de moyenne normale donnerait midi. Cependant, je ne trouve aucune fonction conçue pour faire cela ! Existe-t-il un moyen de faire cela dans R ?

Exemple de données :

hours <- c(20, 21, 22, 23 , 0, 1, 2, 3, 4)

Résultat attendu : moyenne = 0, médiane = 0

4voto

G. Grothendieck Points 40825

1) non décroissante En supposant que les temps ne sont pas décroissants et que chaque temps est inférieur à 24 heures par rapport au temps précédent, nous pouvons déterminer le day de chaque heure en ajoutant 1 chaque fois que l'on rencontre une heure inférieure à l'heure précédente. Additionner 24 fois le jour pour obtenir hour donner hours2 qui est le nombre total d'heures depuis l'heure 0. Enfin, prenez la moyenne ou la médiane modulo 24 pour vous assurer qu'elle se trouve dans l'intervalle [0, 24].

hours <- c(20, 21, 22, 23 , 0, 1, 2, 3, 4)

day <- cumsum(c(0, diff(hours) < 0))
hours2 <- hours + 24 * day

mean(hours2) %% 24
## [1] 0

median(hours2) %% 24
## [1] 0

2) circulaire Dans cette variante, les heures sont représentées sur un cercle et l'on utilise la fonction mean.circular et median.circular du paquet circulaire. De plus amples informations sur ce paquet sont disponibles dans ses fichiers d'aide à l'adresse suivante Répondre à des questions biologiques à l'aide de données circulaires et d'analyses en R

library(circular)

hours <- c(20, 21, 22, 23 , 0, 1, 2, 3, 4)

hours.circ <- circular(hours, template = "clock24", units = "hours")

mean.circ <- mean(hours.circ)
as.numeric(mean.circ) %% 24
## [1] 0

median.circ <- median(hours.circ)
as.numeric(median.circ) %% 24
## [1] 0

plot(hours.circ)
points(mean.circ, col = "red", cex = 3)
points(median.circ, col = "blue", cex = 2)

[suite du graphique]

screenshot

Note

Il peut également être utile d'essayer ce qui précède avec une entrée plus asymétrique.

hours <- c(20, 21, 22, 23 , 12)

2voto

Aron Points 1365

Pour la moyenne circulaire, vous procédez comme suit :

  1. Reportez les heures sur un cercle de 24H en les multipliant par (2*pi/24).
  2. Calculer la moyenne des coordonnées x et y respectivement.
  3. Transformez les coordonnées du cercle moyen en heures.

Je ne sais pas s'il existe une définition bien acceptée de la médiane circulaire.

average_time <- function(x) {

  circle_hours <- x*(2*pi/24)

  mean_x <- mean(cos(circle_hours))
  mean_y <- mean(sin(circle_hours))

  atan2(mean_y, mean_x) / (2*pi) * 24
}

hours <- c(20, 21, 22, 23 , 0, 1, 2, 3, 4)
average_time(hours)
## [1] -1.078441e-15

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X