Wiimote

library(ggplot2)
# Importer les données
data <- read.csv("C:\\Users\\celia\\Documents\\wimote.csv", sep = ";")

# Vérifier les premières lignes du jeu de données
print(head(data))
##    x     RR
## 1 NA -0.296
## 2 NA -0.222
## 3 NA -0.148
## 4 NA -0.185
## 5 NA -0.333
## 6 NA -0.407
# Question A
# Extraire la série temporelle y de la colonne 'RR'
y <- data$RR

# Créer un data frame avec les indices de temps
df <- data.frame(Temps = 1:length(y), RR = y)

# Tracer la série temporelle
ggplot(df, aes(x = Temps, y = RR)) + 
  geom_line() + 
  labs(title = "Série temporelle y", x = "Temps", y = "RR")

# Question B
# Calculer la moyenne de y
mean_y <- mean(y)

# Calculer le profil Y en soustrayant la moyenne de y
Y <- y - mean_y

# Créer un data frame avec les indices de temps et le profil Y
df_Y <- data.frame(Temps = 1:length(Y), Y = Y)

# Tracer le profil Y
ggplot(df_Y, aes(x = Temps, y = Y)) + 
  geom_line() + 
  labs(title = "Profil Y", x = "Temps", y = "Y")

# Question C
# Fonction pour estimer la tendance locale avec une fenêtre linéaire
local_trend <- function(Y, window_size) {
  trend <- rep(0, length(Y))
  half_window <- floor(window_size / 2)
  
  for (i in (half_window + 1):(length(Y) - half_window)) {
    window <- Y[(i - half_window):(i + half_window)]
    trend[i] <- lm(window ~ seq_along(window))$fitted.values[half_window + 1]
  }
  
  return(trend)
}

# Taille de la fenêtre (exemple)
window_size <- 20

# Estimer la tendance locale
trend <- local_trend(Y, window_size)
# Tracer la tendance locale
df_trend <- data.frame(Temps = 1:length(Y), Trend = trend)
ggplot(df_trend, aes(x = Temps, y = Trend)) + 
  geom_line(color = "red") + 
  labs(title = "Tendance locale", x = "Temps", y = "Trend") +
  theme_minimal()

# Calculer l'erreur quadratique moyenne (RMSE)
rmse <- sqrt(mean((Y - trend)^2))

# Afficher l'erreur quadratique moyenne (RMSE)
print(paste("Erreur quadratique moyenne (RMSE):", rmse))
## [1] "Erreur quadratique moyenne (RMSE): 0.588758957678203"
# Question D
# Tracer le profil Y et la tendance locale
df_trend <- data.frame(Temps = 1:length(Y), Y = Y, Trend = trend)

ggplot(df_trend, aes(x = Temps)) + 
  geom_line(aes(y = Y), color = "blue") + 
  geom_line(aes(y = Trend), color = "red") + 
  labs(title = "Profil Y et tendance locale", x = "Temps", y = "Valeur") +
  theme_minimal()

# Configuration des hyperparamètres
S <- 15
s_min <- 20
s_max <- length(Y) / 2
H <- 20
# Fonction pour calculer les fluctuations locales
fluctuations <- function(Y, window_size) {
  F <- numeric(H)
  for (h in 1:H) {
    start <- sample(1:(length(Y) - window_size + 1), 1)
    window <- Y[start:(start + window_size - 1)]
    trend <- local_trend(window, window_size)
    F[h] <- sqrt(mean((window - trend)^2))
  }
  return(F)
}
# Question E
# Calculer les tailles de fenêtres
sizes <- seq(s_min, s_max, length.out = S)

# Calculer les fluctuations locales pour chaque taille de fenêtre
F <- sapply(sizes, function(s) mean(fluctuations(Y, s)))
# Tracer les fluctuations moyennes
df_fluctuations <- data.frame(TailleFenetre = sizes, Fluctuation = F)
ggplot(df_fluctuations, aes(x = TailleFenetre, y = Fluctuation)) + 
  geom_line() + 
  geom_point() + 
  labs(title = "Fluctuations moyennes", x = "Taille de fenêtre", y = "Fluctuation") +
  theme_minimal()

# Calculer le coefficient DFA
log_sizes <- log(sizes)
log_F <- log(F)
dfa_model <- lm(log_F ~ log_sizes)
alpha <- coef(dfa_model)[2]
# Question F
# Ajouter la tendance linéaire au tracé
ggplot(df_fluctuations, aes(x = log_sizes, y = log_F)) + 
  geom_point() + 
  geom_smooth(method = "lm", se = FALSE, color = "red") + 
  labs(title = "Fluctuations moyennes avec tendance linéaire", x = "Log(Taille de fenêtre)", y = "Log(Fluctuation)") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Question G
# Afficher le coefficient DFA
print(paste("Coefficient DFA:", alpha))
## [1] "Coefficient DFA: 0.072311883644034"
# Configuration des hyperparamètres
S <- 500
s_min <- 20
s_max <- length(Y) - 2
H <- 100

# Fonction pour calculer les fluctuations locales sans moyenne
fluctuations_no_avg <- function(Y, window_size) {
  F <- numeric(length(Y) - window_size + 1)
  for (start in 1:(length(Y) - window_size + 1)) {
    window <- Y[start:(start + window_size - 1)]
    trend <- local_trend(window, window_size)
    F[start] <- sqrt(mean((window - trend)^2))
  }
  return(F)
}

# Calculer les fluctuations locales pour chaque taille de fenêtre sans moyenne
sizes <- seq(s_min, s_max, length.out = S)
F_no_avg <- unlist(lapply(sizes, function(s) fluctuations_no_avg(Y, s)))

# Créer un data frame pour les fluctuations complètes
df_full_fluctuations <- data.frame(
  TailleFenetre = rep(sizes, length.out = length(F_no_avg)),
  Fluctuation = F_no_avg
)

# Tracer le nuage de fluctuations
ggplot(df_full_fluctuations, aes(x = TailleFenetre, y = Fluctuation)) + 
  geom_point(size = 0.1, alpha = 0.1) + 
  labs(title = "Nuage de fluctuations", x = "Taille de fenêtre", y = "Fluctuation") +
  theme_minimal()