Dans ce post je montre comment utiliser des fonctions que j'ai écrites pour calculer des aires:
- entre deux courbes
- entre une courbe et une droite horizontale
Cela peut être utile si vous travaillez sur des profils spatiaux qui évoluent au cours du temps (profil topographique par exemple) et que vous souhaitez calculer un bilan (sédimentaire par exemple) entre ces profils.
Données d'exemple et script à télécharger
Considérons le jeu de données disponible ici:
## x1 y1 x2 y2
## 1 1.2 9.507026 1.361827 4.302504
## 2 2.3 5.560263 2.417920 8.182361
## 3 2.9 8.612543 3.235110 8.820354
## 4 4.1 7.246200 3.880343 3.957040
## 5 4.8 6.759984 4.420467 10.003717
## 6 6.0 10.886095 5.044396 9.149287
## 7 7.1 6.964175 6.714750 4.536769
## 8 7.7 7.736687 7.272723 4.530298
## 9 9.0 9.254905 8.441166 5.371384
## 10 10.2 8.767844 9.726646 5.634150
Dans la suite de ce post je vais utiliser une fonction que j'ai appelée area_between
, qui fait partie du package riverbed
, disponible ici
Vous pouvez installer ce package sur R depuis le dépôt en ligne GitHub, en exécutant les commandes suivantes:
plot(x1,y1,type="b",
xlim=c(min(c(x1,x2)),max(c(x1,x2))),
ylim=c(min(c(y1,y2)),max(c(y1,y2))),
xlab="x", ylab="y")
points(x2,y2, type="b", lty=2)
Le graphe suivant représentant les deux séries de données : (x1,y1) en trait plein, (x2,y2) en trait pointillé.
Comment utiliser la fonction area_between?
La fonction area_between
a plusieurs options disponibles. On peut par exemple indiquer plot=T
pour obtenir la représentation graphique des séries considérées et de l'aire calculée. L'option type
permet de préciser si l'on souhaite afficher les surfaces dans le cas où une courbe est au dessus de l'autre ou le contraire. L'option col
permet de préciser de quelle couleur on veut afficher la surface entre les courbes.
Calculer l'aire entre deux courbes:
layout(matrix(1:3, nrow=3))
result=area_between(x1,y1,x2,y2, plot=T, col=c("blue","red"))
result=area_between(x1,y1,x2,y2, plot=T, col="blue", type="upper")
result=area_between(x1,y1,x2,y2, plot=T, col="red", type="lower")
- L'aire en bleu (positive; type "upper") correspond aux zones où y1 est au dessus de y2.
- L'aire en rouge (négative; type "lower") correspond aux zones où y1 est en dessous de y2
result=area_between(x1,y1,x2,y2, plot=FALSE, col=c("blue","red"))
result$area
## [1] 13.71704
result$area_lower
## [1] -3.342189
result$area_upper
## [1] 17.05923
Vous remarquez que l'aire result$area
est égale au bilan result$area_upper+result$area_lower
.
Calculer une aire entre une courbe et une droite horizontale:
La fonction area_between
a aussi une option qui permet de comparer une série de données (x1,y1) à une droite horizontale:
Ici par exemple, on calcule l'aire entre la courbe et la droite horizontale d'équation y=8.5.
result=area_between(x1,y1,h=8.5, plot=T, col="light blue", type="lower")
7 Comments
O
SUPER!!! Merci pour votre travail et votre aide.
pegah
Merci ! Très pratique !
ps : Pourquoi ne pas l'avoir mis sur le CRAN ?
lvaudor
Bonjour! Merci 🙂
Je ne l'ai pas encore mis sur le CRAN car je ne suis pas encore tout-à-fait satisfaite par mon package... et en plus j'appréhende un peu la procédure de dépôt...
lvaudor
... mais pour vous rassurer: je suis tout-à-fait satisfaite de ma fonction area_between 😉
pegah
Bonjour ! Merci pour cette réponse et excusez-moi de réagir 2-3 mois après.
Si j'ai bien compris result$area est le résultat de la somme de result$area_upper et result$area_lower. Mais pourquoi ne faites-vous pas la somme des valeurs absolues de result$lower et result$upper ?
En effet, je dis cela car je rencontre un cas où :
--- pour une première comparaison, result$area_lower = -245 et result$area_upper = 743. Donc result$area = 743 - 245 = 498.
--- pour une seconde comparaison, result$area_lower = -672 et result$area_upper = 48. Donc result$area = 48 - 672 = -624.
Ainsi, on pourrait en conclure que l'erreur (étant définie dans mon cas comme la valeur absolue de l'aire entre deux courbes calculée) est plus faible dans la première comparaison que la seconde. Or, cela semble faux car si l'on regarde par rapport à 0 on obtient :
--- 743 à 0 = 743 ;; -245 à 0 = 245 -> 743+245=988
--- -672 à 0 = 672 ;; 48 à 0 = 48 -> 672+48=720
J'espère avoir été claire et convaincante.
En tout vous devriez songer à le publier sur le CRAN car il s'agit d'une fonction bien utile !
Merci encore !
lvaudor
Bonjour,
à mon tour de réagir un peu tardivement mais je n'ai pas compris votre question de suite 😉
En fonction du domaine d'application, cela peut être utile (ou non) de faire la distinction entre la surface en plus et la surface en moins (j'imagine que pour l'application que vous en faites, ça ne l'est pas, du coup!).
Pour ma part j'ai mis au point cette fonction en ayant en tête une application en géomorphologie fluviale: les géomorphologues comparent un profil en travers de rivière à deux dates, et s'intéressent à la fois à l'érosion et à l'aggradation qui a pu avoir lieu entre ces dates. Dans ce contexte, on ne sait pas ce qui s'est passé exactement entre les deux dates, mais on peut néanmoins se dire que l'aire "au-dessus" est signe d'aggradation tandis que l'aire "en-dessous" est signe d'érosion, et sommer les valeurs absolues constitue une perte d'information puisqu'on perd la distinction entre les deux processus. C'est la raison pour laquelle je conserve les deux mesures en sortie de ma fonction, au lieu de simplement faire le bilan global en sommant les valeurs absolues: j'ai laissé à l'utilisateur le choix de sommer les valeurs absolues, comme vous l'avez fait, si cette info supplémentaire n'avait pas d'intérêt particulier pour eux...
En tout cas, merci pour votre intérêt sur cette fonction! Je n'ai pas encore sauté le pas de l'intégrer à un package et mettre ça sur le CRAN, mais il faudra que j'y songe effectivement. Car cette histoire de calcul d'aire entre deux courbes a beau sembler un peu triviale, on se rend vite compte à l'usage qu'elle ne l'est pas tant que ça!...
Sophie
Bonjour,
Merci pour ces fonctions elles me sont bien utiles !
J'ai tout de même une question , à quoi vous sert la fonction "autocorrelation_lag" ?
Merci