Wednesday 8 February 2017

Moving Moyenne Sas By Proc Expand

Dans ce post, je montre un truc pour faire le calcul de la moyenne mobile (peut être étendu à d'autres opérations nécessitant des fonctions de fenêtrage) qui est super rapide. 1. PROC EXPAND 2. DATA ETAPE 3. PROC SQL Mais de nombreux sites peuvent ne pas autoriser SASETS à utiliser PROC EXPAND et faire la moyenne mobile dans DATA STEP nécessite un certain codage et est sujet à erreurs. PROC SQL est un choix naturel pour les programmeurs juniors et dans de nombreux business cases la seule solution, mais SAS39s PROC SQL manque des fonctions de fenêtrage qui sont disponibles dans de nombreux DB pour faciliter le calcul de la moyenne mobile. Une technique que les gens utilisent habituellement est CROSS JOIN, ce qui est très coûteux et pas une solution viable pour les ensembles de données même de taille moyenne. Dans ce post, je montre un truc pour faire le calcul de la moyenne mobile (peut être étendu à d'autres opérations nécessitant des fonctions de fenêtrage) qui est super rapide. Considérons le calcul de la moyenne mobile le plus simple où les observations K à la traîne sont incluses dans le calcul, à savoir MA (K), ici nous mettons K5. On génère d'abord une donnée d'échantillon de 20 obs, où l'ID de variable doit être utilisée pour le fenêtrage et la variable X doit être utilisée dans le calcul MA, puis on applique le CROSS JOIN standard pour examiner d'abord les données résultantes, non groupées, Pour comprendre comment tirer parti de la structure de données. À partir de l'ensemble de données résultant, il est difficile de trouver un indice, maintenant let39s trier par quotbidquot colonne dans cet ensemble de données: à partir de ces données triées, il est clair que nous don39t ont effectivement à CROSS JOIN ensemble ensemble de données originales, Nous pouvons générer un ensemble de données quotoperationquot qui contient la valeur de différence et laisser l'ensemble de données d'origine CROSS JOIN avec cet ensemble de données quotoperationquot beaucoup plus petit et toutes les données que nous devons utiliser pour le calcul MA seront là. Maintenant let39s le faire: CROSS JOIN données originales avec quotoperationquot données, trier par (a. idops), qui est en fait quotbid39 dans le jeu de données triées Notez que dans le code ci-dessus, il est nécessaire d'avoir ax multiplier par b. weight de sorte que les données Peut être intercalaire, sinon la même valeur X de la table d'origine sera sortie et le calcul MA sera échoué. La variable de poids explicite ajoute en fait plus de souplesse à l'ensemble du calcul MA. Bien que la définition de 1 pour tous obs résultent en un simple calcul de MA, affecter des poids différents aidera à résoudre le calcul MA plus complexes, comme donner d'autres observations moins de poids pour un MA décomposé. Si un paramètre K différent dans les calculs MA (K) est nécessaire, seul l'ensemble des données opérationnelles doit être mis à jour, ce qui est un travail triviale. Maintenant, le modèle de code réel pour le calcul MA (K) sera: Avec cette nouvelle méthode, il est intéressant de le comparer à l'auto coûteux CROSS JOIN ainsi qu'à PROC EXPAND. Sur mon poste de travail (Intel i5 3.8Ghz, 32 Go de mémoire, 1 To 72K HDD), auto CROSS JOIN est prohibitivement long en temps de fonctionnement (si les données sont grandes) alors que la nouvelle méthode utilise seulement 2X autant de temps que PROC EXPAND, les deux consommations de temps sont Trivial comparant à l'auto CROSS JOIN. La consommation de temps indiquée ci-dessous est en quotsecondquot. Ci-dessous les lecteurs de code peuvent exécuter et comparer vous-mêmes. Publié le 10 mai 2015 par Liang Xie SAS Programmation pour les données MiningIm un débutant SAS et Im curieux si la tâche suivante peut être fait beaucoup plus simple car il est actuellement dans ma tête. J'ai les métadonnées (simplifiées) suivantes dans une table nommée userdatemoney: Utilisateur - Date - Money avec différents utilisateurs et des dates pour chaque jour de calendrier (pour les 4 dernières années). Les données sont commandées par User ASC et Date ASC, les données d'échantillon ressemble à ceci: Je veux maintenant calculer une moyenne mobile de cinq jours pour l'argent. J'ai commencé avec l'apprach assez populaire avec la fonction de lag () comme ceci: comme vous voyez, le problème avec cette méthode se produit si là si l'étape de données exécute dans un nouvel utilisateur. Aron obtiendrait des valeurs retardées d'Anna qui bien sûr ne devrait pas se produire. Maintenant, ma question: Je suis sûr que vous pouvez gérer le commutateur utilisateur en ajoutant des champs supplémentaires comme laggeduser et en réinitialisant les variables N, Somme et Moyenne si vous remarquez un tel changement, mais: Cela peut-il être fait d'une manière plus facile? Par Clause en aucune façon Merci pour vos idées et aide Je pense que la façon la plus simple est d'utiliser PROC EXPAND: Et comme mentionné dans le commentaire de Johns, il est important de se souvenir des valeurs manquantes (et des observations de début et de fin aussi). Ive a ajouté l'option SETMISS au code, car vous avez clairement indiqué que vous voulez zéro les valeurs manquantes, ne les ignorez pas (comportement MOVAVE par défaut). Et si vous voulez exclure les 4 premières observations pour chaque utilisateur (car ils n'ont pas assez de pré-historique pour calculer la moyenne mobile 5), vous pouvez utiliser l'option TRIMLEFT 4 à l'intérieur de TRANSFORMOUT (). Répondue Dec 3 13 à 15: 29Début dans la version 6.08 du système SAS, PROC EXPAND dans le logiciel SASETS peut être utilisé pour effectuer une variété de transformations de données. Ces transformations incluent: les prospects, les retards, les moyennes mobiles pondérées et non pondérées, les sommes mobiles et les sommes cumulatives, pour n'en nommer que quelques-unes. De nombreuses nouvelles transformations ont été ajoutées dans la version 6.12, incluant des spécifications distinctes pour les moyennes mobiles centrées et arrières. Ces nouvelles transformations ont obligé à modifier la syntaxe de certaines des transformations prises en charge avant la version 6.12. Des exemples de la façon de spécifier la syntaxe des moyennes mobiles centrées et arrières utilisant la version 6.11 et antérieure et la version 6.12 et plus tard sont donnés ci-dessous. PROC EXPAND peut calculer soit une moyenne mobile centrée, soit une moyenne mobile en arrière. Une moyenne mobile centrée sur 5 périodes est calculée en faisant la moyenne d'un total de 5 valeurs consécutives de la série (la valeur de la période courante en plus des deux valeurs immédiatement précédentes et deux valeurs immédiatement après la valeur courante). Une moyenne mobile en arrière de 5 périodes est calculée en faisant la moyenne de la valeur de la période courante avec les valeurs des 4 périodes immédiatement précédentes. La syntaxe suivante illustre comment utiliser la spécification TRANSFORM (MOVAVE n) pour calculer une moyenne mobile centrée sur 5 périodes à l'aide de la version 6.11 ou antérieure: Pour calculer une moyenne mobile en arrière de période n en utilisant la version 6.11 ou antérieure, utilisez TRANSFORM (MOVAVE) N LAG k), où k (n-1) 2 si n est impair ou où k (n-2) 2 si n est pair. La syntaxe suivante illustre comment utiliser la spécification TRANSFORM (CMOVAVE n) pour calculer une moyenne mobile centrée sur 5 périodes en utilisant la version 6.12 ou plus récente: La syntaxe suivante illustre comment utiliser la spécification TRANSFORM (MOVAVE n) pour calculer une moyenne mobile en arrière de 5 périodes en utilisant la version 6.12 ou ultérieure: Pour plus d'informations, voir Opérations de transformation dans le chapitre EXPAND du Guide de l'utilisateur de SASETS. Si vous n'avez pas accès à SASETS, vous pouvez calculer une moyenne mobile dans l'étape DATA comme illustré dans cet exemple de programme. Informations sur le système d'exploitation et les versions


No comments:

Post a Comment