ranger |
Intervalle |
|---|---|
| ranger | C++/R |
Syntaxe
|
ranger( formula = NULL, data = NULL, num.trees = 500, mtry = NULL, importance = "none", write.forest = TRUE, probability = FALSE, min.node.size = NULL, min.bucket = NULL, max.depth = NULL, replace = TRUE, sample.fraction = ifelse(replace, 1, 0.632), case.weights = NULL, class.weights = NULL, splitrule = NULL, num.random.splits = 1, alpha = 0.5, minprop = 0.1, poisson.tau = 1, split.select.weights = NULL, always.split.variables = NULL, respect.unordered.factors = NULL, scale.permutation.importance = FALSE, local.importance = FALSE, regularization.factor = 1, regularization.usedepth = FALSE, keep.inbag = FALSE, inbag = NULL, holdout = FALSE, quantreg = FALSE, time.interest = NULL, oob.error = TRUE, num.threads = NULL, save.memory = FALSE, verbose = TRUE, node.stats = FALSE, seed = NULL, na.action = "na.learn", dependent.variable.name = NULL, status.variable.name = NULL, classification = NULL, x = NULL, y = NULL, ... ) |
Paramètres
| Nom | Description |
|---|---|
| formula | Objet de formule de classe ou caractère décrivant le modèle à ajuster. Les termes d'interaction ne sont pris en charge que pour les variables numériques. |
| data | Données d'entraînement de la classe data.frame, matrix, dgCMatrix (Matrix) ou gwaa.data (GenABEL). |
| num.trees | Nombre d'arbres. |
| mtry | Nombre de variables pouvant être divisées dans chaque noeud. La valeur par défaut est la racine carrée (arrondie à l'inférieure) du nombre de variables. Alternativement, une fonction à un seul argument renvoie un entier, étant donné le nombre de variables indépendantes. |
| importance | Mode d'importance variable : «aucun», «impureté», «impureté corrigée» ou «permutation». La mesure de l'impureté est l'indice de Gini pour la classification, la variance des réponses pour la régression et la somme des statistiques de test (voir règle de division) pour la survie. |
| write.forest | Enregistrer l'objet ranger.forest, nécessaire à la prédiction. Définir sur FALSE pour réduire l'utilisation de la mémoire si aucune prédiction n'est prévue. |
| probability | Cultivez une forêt de probabilités comme dans Malley et al. (2012). |
| min.node.size | Taille minimale du noeud à fractionner. Par défaut : 1 pour la classification, 5 pour la régression, 3 pour la survie et 10 pour la probabilité. Pour la classification, il peut s'agir d'un vecteur de valeurs spécifiques à la classe. |
| min.bucket | Taille minimale du noud terminal. Aucun noud inférieur à cette valeur ne peut être présent. La valeur par défaut est 3 pour la survie et 1 pour tous les autres types d'arbres. Pour la classification, il peut s'agir d'un vecteur de valeurs spécifiques à la classe. |
| max.depth | Profondeur maximale de l'arbre. Une valeur nulle ou 0 (par défaut) correspond à une profondeur illimitée, et 1 aux souches (une division par arbre). |
| replace | Échantillon avec remplacement. |
| sample.fraction | Fraction d'observations à échantillonner. La valeur par défaut est 1 pour l'échantillonnage avec remise et 0,632 pour l'échantillonnage sans remise. Pour la classification, il peut s'agir d'un vecteur de valeurs spécifiques à la classe. |
| case.weights | Pondérations pour l'échantillonnage des observations d'entraînement. Les observations ayant une pondération plus élevée seront sélectionnées avec une probabilité plus élevée dans les échantillons bootstrap (ou sous-échantillonnés) des arbres. |
| class.weights | Pondérations des classes de résultats (par ordre de niveaux de facteurs) dans la règle de division (apprentissage sensible aux coûts). Classification et prédiction probabiliste uniquement. Pour la classification, les pondérations sont également appliquées lors du vote majoritaire aux nouds terminaux. Règle de division splitrule. Pour la classification et l'estimation probabiliste, «gini», «extratrees» ou «hellinger» avec «gini» par défaut. Pour la régression, «variance», «extratrees», «maxstat», «beta» ou «poisson» avec «variance» par défaut. Pour la survie, «logrank», «extratrees», «C» ou «maxstat» avec «logrank» par défaut. |
| num.random.splits | Pour la règle de division «extratrees» : nombre de divisions aléatoires à prendre en compte pour chaque variable de division candidate. |
| alpha | Pour la règle de division «maxstat» : seuil de signification pour autoriser la division. |
| minprop | Pour la règle de division «maxstat» : quantile inférieur de la distribution des covariables à prendre en compte pour la division. |
| poisson.tau | Pour la règle de division «Poisson» : le coefficient de variation de la fréquence (attendue) est de 1/Τ. Si un noud terminal n'a que 0 réponse, l'estimation est fixée à α0 + (1 - α)mean(parent) avec α = samples(child)mean(parent)/(Τ + samples(child)mean(parent)). |
| split.select.weights | Vecteur numérique avec des pondérations comprises entre 0 et 1, utilisé pour calculer la probabilité de sélection des variables à diviser. Une liste de tailles num.trees, contenant les vecteurs de pondération de sélection pour chaque arbre, peut également être utilisée. |
| always.split.variables | Vecteur de caractères avec des noms de variables à toujours sélectionner en plus des variables essayées pour le fractionnement. |
| respect.unordered.factors | Gestion des covariables factorielles non ordonnées. L'une des options est « ignorer », « ordre » et « partitionner ». Pour la règle de division « arbres supplémentaires », la valeur par défaut est « partitionner » pour toutes les autres règles de division « ignorer ». Alternativement, les valeurs VRAI (= « ordre ») ou FAUX (= « ignorer ») peuvent être utilisées. |
| scale.permutation.importance | Importance de la permutation d'échelle par erreur type, comme dans (Breiman 2001). Applicable uniquement si le mode d'importance de la variable de permutation est sélectionné. |
| local.importance | Calculer et renvoyer les valeurs d'importance locale comme dans (Breiman 2001). Applicable uniquement si l'importance est définie sur «permutation». |
| regularization.factor | Facteur de régularisation (pénalisation du gain), soit un vecteur de longueur p, soit une valeur pour toutes les variables. |
| regularization.usedepth | Considérez la profondeur de la régularisation. |
| keep.inbag | Enregistrez la fréquence à laquelle les observations sont enregistrées dans le sac dans chaque arbre. |
| inbag | Définissez manuellement les observations par arbre. Liste de tailles d'arbres, contenant le nombre d'arbres dans le sac pour chaque observation. Peut être utilisé pour un échantillonnage stratifié. |
| holdout | Mode de rétention. Retenez tous les échantillons dont le poids de cas est égal à 0 et utilisez-les pour l'importance des variables et l'erreur de prédiction. |
| quantreg | Préparer la prédiction quantile comme dans les forêts de régression quantile (Meinshausen 2006). Régression uniquement. Définir keep.inbag = TRUE pour préparer la prédiction quantile out-of-bag. |
| time.interest | Points temporels d'intérêt (survie uniquement). Peut être nul (par défaut, utiliser tous les points temporels observés), un vecteur de points temporels ou un seul nombre pour utiliser autant de points temporels (grille sur les points temporels observés). |
| oob.error | Calculez l'erreur de prédiction hors bande. Définissez-la sur FAUX pour gagner du temps de calcul, par exemple pour les grandes forêts de survie. |
| num.threads | Nombre de processus légers. Utilisez 0 pour tous les cours disponibles. La valeur par défaut est 2 si elle n'est pas définie par les options/variables d'environnement. |
| save.memory | Utilisez le mode de fractionnement économe en mémoire (mais plus lent). Aucun effet sur les données de survie et GWAS. Attention : cette option ralentit la croissance de l'arbre ; utilisez-la uniquement en cas de problèmes de mémoire. |
| verbose | Afficher l'état du calcul et le temps d'exécution estimé. |
| node.stats | Enregistrer les statistiques des nouds. Définir sur TRUE pour enregistrer la prédiction, le nombre d'observations et les statistiques de répartition pour chaque noeud. |
| seed | Graine aléatoire. La valeur par défaut est NULL, ce qui génère la graine à partir de R. Définissez-la sur 0 pour ignorer la graine R. |
| na.action | Gestion des valeurs manquantes. Définissez « na.learn » pour gérer les valeurs manquantes en interne (par défaut), «na.omit» pour omettre les observations manquantes et «na.fail» pour arrêter si des valeurs manquantes sont trouvées. |
| dependent.variable.name | Nom de la variable dépendante, nécessaire si aucune formule n'est fournie. Pour les forêts de survie, il s'agit de la variable temporelle. |
| status.variable.name | Nom de la variable d'état, applicable uniquement aux données de survie et nécessaire si aucune formule n'est fournie. Utiliser 1 pour un événement et 0 pour une censure. |
| classification | Définir sur TRUE pour développer une forêt de classification. Nécessaire uniquement si les données sont une matrice ou la réponse numérique. |
| x | Données prédictives (variables indépendantes), interface alternative aux données avec formule ou dependent.variable.name. |
| y | Vecteur de réponse (variable dépendante), interface alternative aux données avec formule ou nom de variable dépendante. Pour la survie, utilisez un objet Surv() ou une matrice avec heure et statut. |
| ... | Autres paramètres passés vers ou depuis d'autres méthodes (actuellement ignorés) |
Description
Cette fonction permet d'entraîner un modèle de forêt aléatoire rapide, pour des tâches de classification, régression ou survie. Ranger est une implémentation rapide des forêts aléatoires (Breiman 2001) ou du partitionnement récursif, particulièrement adaptée aux données de grande dimension. Les forêts de classification, de régression et de survie sont prises en charge. Les forêts de classification et de régression sont implémentées comme dans la forêt aléatoire originale (Breiman 2001), les forêts de survie comme dans les forêts de survie aléatoires (Ishwaran et al. 2008). Il inclut des implémentations d'arbres extrêmement randomisés (Geurts et al. 2006) et de forêts de régression quantile (Meinshausen 2006).
Remarques
- Le type d'arbre est déterminé par le type de variable dépendante. Pour les facteurs, des arbres de classification sont créés, pour les valeurs numériques, des arbres de régression et pour les objets de survie, des arbres de survie. L'indice de Gini est utilisé comme règle de division par défaut pour la classification. Pour la régression, les variances de réponse estimées ou les statistiques de rang maximal sélectionné (Wright et al. 2016) peuvent être utilisées. Pour la survie, le test du log-rank, une règle de division basée sur l'indice C (Schmid et al. 2015) et les statistiques de rang maximal sélectionné (Wright et al. 2016) sont disponibles. Pour tous les types d'arbres, des forêts d'arbres extrêmement randomisés (Geurts et al. 2006) peuvent être créées.
- Avec l'option de probabilité et la variable dépendante du facteur, une forêt de probabilités est créée. Ici, l'impureté du noud est utilisée pour la division, comme dans les forêts de classification. Les prédictions sont des probabilités de classe pour chaque échantillon. Contrairement à d'autres implémentations, chaque arbre renvoie une estimation de probabilité, dont la moyenne est calculée pour l'estimation de probabilité de la forêt. Pour plus de détails, voir Malley et al. (2012). Notez que des noeuds d'une taille inférieure à min.node.size peuvent apparaître, car min.node.size est la taille minimale de noud à laquelle effectuer le fractionnement, comme dans les forêts aléatoires originales. Pour limiter la taille des noeuds terminaux, définissez min.bucket. Les variables sélectionnées avec always.split.variables sont testées en plus des variables mtry sélectionnées aléatoirement. Dans split.select.weights, la somme des pondérations n'est pas nécessairement égale à 1 ; elles seront normalisées ultérieurement. Les pondérations sont attribuées aux variables selon leur ordre d'apparition dans la formule ou dans les données si aucune formule n'est utilisée. Les noms du vecteur split.select.weights sont ignorés. Les pondérations attribuées par split.select.weights aux variables dans always.split.variables sont ignorées. L'utilisation de split.select.weights peut augmenter les temps de calcul pour les forêts de grande taille.
- Les covariables factorielles non ordonnées peuvent être traitées de trois manières différentes à l'aide de respect.unordered.factors : pour « ignorer », tous les facteurs sont considérés comme ordonnés ; pour « partitionner », toutes les 2-partitions possibles sont prises en compte pour la division. Pour « ordre » et la classification à 2 classes, les niveaux de facteurs sont ordonnés selon leur proportion de facteurs appartenant à la deuxième classe ; pour la régression, selon leur réponse moyenne, comme décrit dans Hastie et al. (2009). Pour la classification multiclasse, les niveaux de facteurs sont ordonnés selon la première composante principale de la matrice de covariance pondérée du tableau de contingence (Coppersmith et al. 1999), pour la survie, selon la médiane de survie (ou le plus grand quantile disponible si la médiane n'est pas disponible). L'utilisation de « ordre » est recommandée, car elle est rapide en termes de calcul et permet de gérer un nombre illimité de niveaux de facteurs. Notez que les facteurs ne sont réordonnés qu'une seule fois et non à nouveau à chaque division. La mesure d'importance « impurity_corrected » est impartiale en termes de nombre et de fréquence de catégories et est presque aussi rapide que la mesure d'importance d'impureté standard. Il s'agit d'une version modifiée de la méthode de Sandri et Zuccolotto (2008), plus rapide et plus économe en mémoire. Voir Nembrini et al. (2018) pour plus de détails. Cette mesure d'importance peut être combinée aux méthodes d'estimation des valeurs de p dans importance_pvalues. Nous recommandons de ne pas utiliser la mesure d'importance « impurity_corrected » lors des prédictions, car l'étape de permutation des caractéristiques pourrait réduire les performances prédictives (un avertissement est généré lors de la prédiction sur de nouvelles données).
- Notez que ranger a des valeurs par défaut différentes de celles des autres packages. Par exemple, notre valeur par défaut pour mtry est la racine carrée du nombre de variables pour tous les types d'arbres, tandis que d'autres packages utilisent des valeurs différentes pour la régression. De plus, la modification d'un hyperparamètre ne modifie pas les autres hyperparamètres (lorsque cela est possible). Par exemple, splitrule="extratrees" utilise le découpage aléatoire, mais ne désactive pas le bagging comme dans Geurts et al. (2006). Pour désactiver le bagging, utilisez replace = FALSE, sample.fraction = 1. Cette méthode peut également être utilisée pour développer un arbre de décision unique sans bagging ni sous-ensemble de caractéristiques : ranger(..., num.trees = 1, mtry = p, replace = FALSE, sample.fraction = 1), où p est le nombre de variables indépendantes.
- Bien que les forêts aléatoires soient réputées pour leur robustesse, les hyperparamètres par défaut ne fonctionnent pas toujours bien. Par exemple, pour les données de grande dimension, il est recommandé d'augmenter la valeur de mtry et le nombre d'arbres num.trees. Pour plus de détails et de recommandations, voir Probst et al. (2019). Pour trouver les meilleurs hyperparamètres, envisagez de les ajuster avec les paquets tuneRanger ou mlr3.
- L'erreur de prédiction out-of-bag est calculée comme la précision (proportion d'observations mal classées) pour la classification, comme le pointage de Brier pour l'estimation de probabilité, comme l'erreur quadratique moyenne (EQM) pour la régression et comme l'indice C de Harrell moins un pour la survie. L'indice C de Harrell est calculé à partir de la somme de la fonction de risque cumulé (FRC) sur tous les points temporels, c'est-à-dire rowSums(FRC), où FRC est l'erreur de prédiction out-of-bag ; pour plus de détails, voir Ishwaran et al. (2008). Le calcul de l'erreur de prédiction out-of-bag peut être désactivé avec oob.error = FALSE.
- La régularisation consiste à pénaliser les nouvelles variables en multipliant le critère de division par un facteur ; voir Deng et Runger (2012) pour plus de détails. Si regularization.usedepth=TRUE, fd est utilisé, où f est le facteur de régularisation et d la profondeur du noud. Si la régularisation est utilisée, le multithreading est désactivé, car tous les arbres doivent accéder à la liste des variables déjà incluses dans le modèle.
- Les valeurs manquantes peuvent être gérées en interne en définissant na.action = "na.learn" (par défaut), en omettant les observations avec des valeurs manquantes avec na.action = "na.omit" ou en arrêtant si des valeurs manquantes sont trouvées avec na.action = "na.fail". Avec na.action = "na.learn", les valeurs manquantes sont ignorées lors du calcul d'une valeur initiale du critère de division (c'est-à-dire la diminution de l'impureté). Ensuite, pour la meilleure division, toutes les valeurs manquantes sont testées dans les deux noeuds enfants et le choix est effectué en fonction de la valeur du critère de division. Pour la prédiction, cette direction est enregistrée comme direction par défaut. Si une valeur manquante se produit dans la prédiction à un noud sans direction par défaut, elle va vers la gauche.
- Pour un grand nombre de variables et de blocs de données en entrée, l'interface de formule peut être lente, voire impossible à utiliser. Alternativement, dependent.variable.name (et status.variable.name pour la survie) ou x et y peuvent être utilisés. Utilisez x et y avec une matrice pour x afin d'éviter les conversions et d'économiser de la mémoire. Envisagez de définir save.memory = TRUE si vous rencontrez des problèmes de mémoire avec des ensembles de données très volumineux, mais sachez que cette option ralentit la croissance de l'arbre.
- Pour les données GWAS, envisagez de combiner ranger avec le paquet GenABEL. Consultez la section Exemples ci-dessous pour une démonstration utilisant des données Plink. Tous les SNP de l'objet GenABEL seront utilisés pour le fractionnement. Pour utiliser uniquement les SNP sans sexe ni autres covariables du fichier phénotype, utilisez 0 à droite de la formule. Notez que les valeurs manquantes sont traitées comme une catégorie supplémentaire lors du fractionnement.
- Par défaut, ranger utilise deux processus léger. La valeur par défaut peut être modifiée avec : (1) num.threads dans l'appel ranger/predict, (2) la variable d'environnement R_RANGER_NUM_THREADS, (3) options(ranger.num.threads = N), (4) options(Ncpus = N), avec priorité dans cet ordre.
Valeur
Objet de classe ranger avec éléments :
| Nom | Description |
|---|---|
| forest | Forêt enregistrée (si write.forest est défini sur TRUE). Notez que les identifiants de variable dans l'objet split.varIDs ne représentent pas nécessairement le numéro de colonne dans R. |
| predictions | Classes/valeurs prédites, basées sur des échantillons hors sac (classification et régression uniquement). |
| variable.importance | Importance variable pour chaque variable indépendante. |
| variable.importance.local | Importance variable pour chaque variable indépendante et chaque échantillon, si local.importance est défini sur TRUE et importance est défini sur « permutation ». |
| prediction.error | Erreur de prédiction globale out-of-bag. Pour la classification, il s'agit de la précision (proportion d'observations mal classées), pour l'estimation de la probabilité, du score de Brier ; pour la régression, de l'erreur quadratique moyenne ; et pour la survie, de l'indice C de Harrell (un moins). r.carré : R carré. Également appelé variance expliquée ou coefficient de détermination (régression uniquement). Calculé à partir des données out-of-bag. |
| confusion.matrix | Tableau de contingence pour les classes et les prédictions basées sur des échantillons hors sac (classification uniquement). |
| unique.death.times | Heures de mort uniques (survie uniquement). |
| chf | Fonction de risque cumulé estimée pour chaque échantillon (survie uniquement). |
| survival | Fonction de survie estimée pour chaque échantillon (survie uniquement). |
| call | Appel de fonction. |
| num.trees | Nombre d'arbres. |
| num.independent.variables | Nombre de variables indépendantes. |
| mtry | Valeur de mtry utilisée. |
| min.node.size | Valeur de la taille minimale du noud utilisé. |
| treetype | Type de forêt/arbre. classification, régression ou survie. |
| importance.mode | Mode d'importance utilisé. |
| num.samples | Nombre d'échantillons. |
| inbag.counts | Nombre de fois où les observations sont dans le sac dans les arbres. |
| dependent.variable.name | Nom de la variable dépendante. Cette valeur est nulle lorsque l'interface x/y est utilisée. |
| status.variable.name | Nom de la variable d'état (survie uniquement). Cette valeur est nulle lorsque l'interface x/y est utilisée. |
Références
- Wright, M. N. et Ziegler, A. (2017). ranger : Implémentation rapide de forêts aléatoires pour les données de grande dimension en C++ et R. J Stat Softw 77:1-17. doi:10.18637/jss.v077.i01.
- Schmid, M., Wright, M. N. et Ziegler, A. (2016). Utilisation du C de Harrell pour la prédiction du risque clinique via des forêts aléatoires de survie. Expert Syst Appl 63:450-459. doi:10.1016/j.eswa.2016.07.018. Wright, M. N., Dankowski, T. et Ziegler, A. (2017). Sélection non biaisée de variables fractionnées pour les forêts aléatoires de survie à l'aide de statistiques de rang sélectionné au maximum. Stat Med 36:1272-1284. doi:10.1002/sim.7212.
- Nembrini, S., Koenig, I. R. & Wright, M. N. (2018). Le renouveau de l'importance du coefficient de Gini ? Bioinformatique. doi:10.1093/bioinformatics/bty373.
- Breiman, L. (2001). Forêts aléatoires. Mach Learn, 45:5-32. doi:10.1023/A:1010933404324.
- Ishwaran, H., Kogalur, U. B., Blackstone, E. H. & Lauer, M. S. (2008). Forêts aléatoires de survie. Ann Appl Stat 2:841-860. doi:10.1097/JTO.0b013e318233d835.
- Malley, J. D., Kruppa, J., Dasgupta, A., Malley, K. G., & Ziegler, A. (2012). Machines probabilistes : estimation de probabilité cohérente à l'aide de machines d'apprentissage non paramétrique. Methods Inf Med 51:74-81. doi:10.3414/ME00010052.
- Hastie, T., Tibshirani, R., Friedman, J. (2009). Éléments d'apprentissage statistique. Springer, New York. 2e édition.
- Geurts, P., Ernst, D., Wehenkel, L. (2006). Arbres extrêmement randomisés. Mach Learn 63:3-42. doi:10.1007/s1099400662261.
- Meinshausen (2006). Forêts de régression quantile. J Mach Learn Res 7:983-999.
- Sandri, M. & Zuccolotto, P. (2008). Un algorithme de correction de biais pour la mesure de l'importance de la variable de Gini dans les arbres de classification. J Comput Graph Stat, 17:611-628. doi:10.1198/106186008X344522.
- Coppersmith D., Hong S. J., Hosking J. R. (1999). Partitionnement des attributs nominaux dans les arbres de décision. Data Min Knowl Discov 3:197-217. doi:10.1023/A:1009869804967.
- Deng & Runger (2012). Sélection de caractéristiques via des arbres régularisés. Conférence internationale conjointe sur les réseaux de neurones (IJCNN) 2012, Brisbane, Australie. doi:10.1109/IJCNN.2012.6252640.
- Probst, P., Wright, M. N. et Boulesteix, A-L. (2019). Hyperparamètres et stratégies de réglage pour la forêt aléatoire. WIREs Data Mining Knowl Discov 9:e1301.doi:10.1002/widm.1301.
Exemples
- ## Forêt de classification avec paramètres par défaut
- ranger(Species ~ ., data = iris)
- ## Prédiction
- train.idx <- sample(nrow(iris), 2/3 * nrow(iris))
- iris.train <- iris[train.idx, ]
- iris.test <- iris[-train.idx, ]
- rg.iris <- ranger(Species ~ ., data = iris.train)
- pred.iris <- predict(rg.iris, data = iris.test)
- table(iris.test$Species, pred.iris$predictions)
- ## Quantile regression forest
- rf <- ranger(mpg ~ ., mtcars[1:26, ], quantreg = TRUE)
- pred <- predict(rf, mtcars[27:32, ], type = "quantiles")
-
- timepoints.ranger 27
- pred$predictions
- ## Importance variable
- rg.iris <- ranger(Species ~ ., data = iris, importance = "impurity")
- rg.iris$variable.importance
- ## Forêt de survie
- require(survival)
- rg.veteran <- ranger(Surv(time, status) ~ ., data = veteran)
- plot(rg.veteran$unique.death.times, rg.veteran$survival[1,])
- ## Interfaces alternatives (mêmes résultats)
- ranger(dependent.variable.name = "Species", data = iris)
- ranger(y = iris[, 5], x = iris[, -5])
- ## Non exécuté :
- ## Utiliser l'interface GenABEL pour lire les données Plink dans R et développer une forêt de classification
- ## Les fichiers ped et map ne sont pas inclus
- library(GenABEL)
- convert.snp.ped("data.ped", "data.map", "data.raw")
- dat.gwaa <- load.gwaa.data("data.pheno", "data.raw")
- phdata(dat.gwaa)$trait <- factor(phdata(dat.gwaa)$trait)
- ranger(trait ~ ., data = dat.gwaa)
- ## Fin (non exécuté)