2015-10-21 4 views
0

J'ai besoin d'augmenter chaque nombre dans un tableau (une colonne dans un ensemble de données SAS) à une certaine puissance. On m'a dit que cela peut être fait en IML, après avoir écrit le contenu de la colonne dans une matrice. Cependant, une matrice doit apparemment être carrée pour être élevée à une puissance dans l'IML, et mes données sont très et non une matrice carrée. Quelle est la procédure et la syntaxe pour élever une colonne de nombres à une puissance?Élever un tableau de nombres à une puissance dans SAS

Désolé de poser des questions sur des choses aussi simples, je suis aussi novice que possible pour SAS.

+0

Je comprends que j'aurais dû dire "range" au lieu de "array". – Mhoram

+1

@ La réponse de Stu ci-dessous est correcte. Si vous êtes en IML et que vous essayez Mat ** 2, alors vous essayez une multiplication matricielle (Mat x Mat ou Mat au carré). Vous vouliez un élément, dont l'opérateur est #. Alors Mat ## 2 fera un élément de puissance sage. – DomPazz

Répondre

3

Pas besoin de vous excuser. SAS est un processus de réflexion très différent qui demande beaucoup de pratique. Vous posez toutes les bonnes questions.

SAS est un langage itératif. Le tableau de nombres dont vous parlez ressemble à de nombreuses observations individuelles dans un ensemble de données. SAS effectue des opérations sur les valeurs une ligne à la fois dans chaque ensemble de données, puis passe à la ligne suivante dès qu'elle atteint le bas d'une étape de données.

En supposant que votre ensemble de données ressemble à ceci:

var 
1 
2 
3 
4 

Si vous vouliez carré chaque numéro, vous devez créer une nouvelle variable (ou vous pouvez remplacer la variable actuelle, votre choix) et utiliser l'opérateur exposant ** .

data want; 
    set have; 
    var_squared = var**2; 
run; 

Dans cette étape, SAS crée un ensemble de données want, lit le jeu de données have, crée une nouvelle variable numérique de longueur 8 du nom var_squared, attribue une valeur de var*var, puis les sorties. Il répète le cycle lecture-calcul-écriture pour chaque ligne jusqu'à ce qu'il atteigne la fin du marqueur de fichier. Notez que output est implicite automatiquement. Lorsque vous ne spécifiez pas output, SAS écrit automatiquement dans le nouveau jeu de données dès qu'il atteint run.

Votre nouvel ensemble de données ressemblera à ceci:

var var_squared 
1 1 
2 4 
3 9 
4 16 
+0

Merci! Je vais essayer de le faire et voir ce qui se passe. – Mhoram

0

Comme vous l'avez découvert, la langue SAS/IML fournit de nombreux autres types de multiplication et opérations « élever au pouvoir » que les opérations scalaires familières. Vous pouvez en savoir plus sur different ways to multiply in the SAS/IML language.

Pour la plupart des opérations, le langage SAS/IML fait la distinction entre elementwise operations and vector or matrix operations. Pour votre cas d'utilisation, vous devez utiliser l'opérateur de puissance élémentaire (##) qui va élever chaque élément d'un vecteur ou d'une matrice à une puissance. Par exemple, pour calculer le carré de la hauteur de chaque étudiant dans un ensemble de données, vous pouvez utiliser:

proc iml; 
use sashelp.class; 
read all var {"Height"}; 
close sashelp.class; 

sqHt = Height##2; /* raise each element to 2nd power */ 
print Height sqHt; 
0

Merci! J'ai utilisé l'opérateur élémentaire, et cela a fonctionné (le logiciel ne s'y est pas opposé cette fois), bien qu'un autre problème se soit posé (sur lequel je poserai une question séparée).