基本的なSASプログラム#

SASはプログラミング言語なので、まずは以下のようなシンプルなSASプログラムを見てみましょう。

/****************
This program reads in a set of grades for six students, 
and prints out their student numbers and genders
******************/
 
DATA grade;
  InPuT subject gender $
        exam1 exam2 hwgrade $;
  LABEL exam1 = "Exam 1 grade";
  FORMAT exam2 4.2;
  DATELINES;
  10 M 80 84 A
   7 . 85 89 A
   4 F 90 .  B
  20 M 82 85 B
  25 F 94 94 A
  14 F 88 84 C
  ;
RUN;
 
PROC PRINT data=grade;
  var subject gender; * print student ID and gender;
run;
SAS 出力

SAS システム

OBS subject gender
1 10 M
2 7  
3 4 F
4 20 M
5 25 F
6 14 F

このプログラムのコードを今の段階で完全に理解する必要はありません。このプログラムが6人の生徒の成績を読み込んで出力していることだけ覚えておいてください。DATAステートメントから最初のRUNステートメントまでの行は、SASに成績を読み込ませる役割があります。そして、PROC PRINTステートメントから2番目のRUNステートメントまでの行は、6人の生徒の学生番号と性別を出力させる役割があります。

他のプログラミング言語と同様に、SASプログラムは順番に実行される一連の命令です。つまり、あなたがこのページの単語を読むように、SASはプログラムを上から下、左から右に読み込んで実行します。そして、私があなたに伝わるように言語とおふとく則に従わなければならないように、SASがプログラムを適切に読み込んで実行するためには、「構文」と呼ばれる一定のルールに従わなければなりません。

基本的なSASプログラムの要件#

ここでは、すべてのSASプログラムが従わなければならない基本的な要件をリストアップします。これらを読む際、上記のプログラムを参照して、それぞれのルールが実際に従われていることを確認するとよいでしょう。

SASステートメントのルール SASステートメントの基本的な要件は次のとおりです。

  • データを含むステートメント以外のすべてのSASステートメントは、セミコロン(;)で終わる必要があります(「DATA grade;」はSASステートメントの例です。「DATALINES;」も別の例です)。

  • SASステートメントは通常、SASキーワードで始まります(上記のプログラムでの例はOPTIONS、TITLE、DATA、INPUT、DATALINES、RUN、PROC、VARです)。

  • SASプログラムはフリーフォーマットです。

    • セミコロンで区切れば、任意の数のSASステートメントを1行に記述できます(上から2行目がその一例です)。

    • 1つの単語を分割しない限り、SASステートメントは次の行に続けることができます(「InPuT …」で始まるステートメントがその一例です)。

    • SASステートメントはどの列からでも始めることができます。

  • SASステートメントは大文字と小文字を区別しません。つまり、小文字、大文字、または両方の組み合わせで入力できます(「InPuT …」で始まるステートメントがその一例です)。

  • SASステートメントの単語は、空白または特殊文字(=、+、*など)で区切られます。

  • コメントを使用してプログラムに注釈を付けることができ(そうするべき)です。2つの方法があります。

    • 区切りコメントは、前向きスラッシュ-アスタリスク/* で始まり、アスタリスク-前向きスラッシュ*/で終わります。区切り内のテキストはすべてSASによって無視されます(プログラムの最初の5行がその一例です)。

    • 別のコメント方法は、アスタリスク*で始まりセミコロン;で終わります。アスタリスク*とセミコロン;の間のテキストはすべてSASによって無視されます(上から2行目の2番目のステートメントがその一例です)。

SAS名のルール SAS名は、SASデータセット名、変数名、その他のアイテムに使用されます。上記のプログラムに現れるデータセット名の例はgradeです。変数名の例としては、subjectとexam2があります。注意点として、プログラムに現れる各名前はすべて、以下のルールに従っています。

  • すべての名前は1文字から32文字の間でなければなりません。

  • 名前の最初の文字は、アルファベット(A、B、…Z、a、b、…z)またはアンダースコア(_)でなければなりません。2文字目以降は、アルファベット、数字、アンダースコアでなければなりません。つまり、他の文字($、%、&など)は許可されず、空白も含められません。

  • SAS名は大文字と小文字を区別しません。つまり、小文字、大文字、または両方の組み合わせで入力できます(SASは引用符内でのみ大文字と小文字を区別します)。

PROC ステップとデータステップ データステップとPROC ステップ(PROCは”procedure”・プロシージャの略)は、あらゆるSASプログラムの基本的な構成要素です。

  • DATAステートメントで始まり、RUNステートメント、別のDATAステートメント、またはPROCステートメントで終わるSASプログラムの部分は、データステップと呼ばれます。

  • PROCステートメントで始まり、RUNステートメント、DATAステートメント、または別のPROCステートメントで終わるSASプログラムの部分は、PROCステップと呼ばれます。

一般的に、データステップはデータの管理に使用されます。例えば、データステップは、SASデータセットにデータを読み込む、データ値を修正する、データエラーを確認および修正する、データセットをサブセットまたはマージするために使用されます。一方、PROCステップは、SASデータセットに含まれるデータを分析するためのあらかじめ書かれたルーチンです。例えば、PROCステップは、記述統計を計算する、要約レポートを生成する、グラフや図表を作成するために使用されます。

上記のプログラムでは、DATA grade;ステートメントと最初のRUN;ステートメントの間にあるすべてのステートメントが、プログラムに含まれる唯一のデータステップを構成しています。また、PROC PRINT data = grade;ステートメントと2番目のRUN;ステートメントの間にあるすべてのステートメントが、プログラムに現れる唯一のPROCステップを構成しています。

注! 定義上、SASはRUNステートメントがない場合、別のDATAまたはPROCステートメントが呼び出されたときにDATAステートメントとほとんどのPROCステートメントを実行します。ただし、すべてのデータステップとPROCステップをRUNステートメントで閉じることが良いプログラミングの習慣です。また、DATAステートメントとPROCステートメントは、SASコードで個別の操作として記述する必要があり、PROCステップをデータステップ内に組み合わせたり、その逆はできないことに注意してください。

SASデータセット#

データを分析するには、SASが理解できるデータセットにデータを読み込む必要があります。SASデータセットは、ディスクリプタ部とデータ部分の2つの部分で構成されるファイルです。

SASデータセットのディスクリプタ部には、データセットの名前、データセットが作成された日時、オブザベーションの数、変数の数などのデータセットの重要な統計情報が含まれています。以下の表は、work.gradeというデータセットでPROC CONTENTSを実行したときのディスクリプタ部の一部です。

ods select Attributes;
proc contents data = work.grade;
run;
ods select all;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.GRADE オブザベーション数 6
メンバータイプ DATA 変数の数 5
エンジン V9 インデックス数 0
作成日時 2024/06/06 06:09:53 オブザベーションのバッファ長 40
更新日時 2024/06/06 06:09:53 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    

以下はSASデータセットのデータ部です。データ部はPROC PRINTなどを使用して表示できる、データの値が一覧として配置されたものです。

proc print data = work.grade;
run;
SAS 出力

SAS システム

OBS subject gender exam1 exam2 hwgrade
1 10 M 80 84.0 A
2 7   85 89.0 A
3 4 F 90 . B
4 20 M 82 85.0 B
5 25 F 94 94.0 A
6 14 F 88 84.0 C

この例では、「subject」(id) 10はデータ値、「gender」のコードMはデータ値、というように続きます。他の統計ソフトウェアのデータセットと同様に、SASデータセットは変数とオブザベーションで構成されています。変数(列)は、測定対象の特性を記述するデータ値の集合です。SASデータセットには数千の変数を格納できます。ここではデータセットに5つの変数(subject、gender、exam1(試験1の成績)、exam2(試験2の成績)、hwgrade(課題の成績))が含まれています。オブザベーション(行)は、通常1つの対象(例えばSusieという名前の人)に関連するデータ値のコレクションです。値10、M、80、84、Aはこのデータセットにおける1つのオブザベーションを構成しています。SASデータセットには任意の数のオブザベーションを格納できます。ここではデータセットに6つのオブザベーションが含まれています。

SAS変数#

以下のデータから気づくかもしれない点:

proc print data = work.grade;
run;
SAS 出力

SAS システム

OBS subject gender exam1 exam2 hwgrade
1 10 M 80 84.0 A
2 7   85 89.0 A
3 4 F 90 . B
4 20 M 82 85.0 B
5 25 F 94 94.0 A
6 14 F 88 84.0 C

数値型の変数(subject、exam1、exam2)と文字型の変数(gender、hwgrade)の2種類の変数があることです。変数の型は、SASがすべてのSASデータセットのディスクリプタ部に格納する6つの属性の1つで、6つの属性は次のとおりです。

  • 変数の 名前

  • 変数の タイプ(型)

  • 変数の 長さ

  • 変数の 出力形式(フォーマット)(存在する場合)

  • 変数の 入力形式(インフォーマット)(存在する場合)

  • 変数の ラベル(存在する場合)

上の一覧にある「(存在する場合)」というフレーズから分かるように、インフォーマット、フォーマット、ラベルは存在するとは限りません。一方、名前、型、長さは、すべての変数に存在します。以下は、SASデータセットのディスクリプタ部にある変数の属性情報の一部リストの例です。

ods select Variables;
proc contents data = work.grade;
run;
ods select all;
SAS 出力

SAS システム

CONTENTS プロシジャ

変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ 出力形式 ラベル
3 exam1 数値 8   Exam 1 grade
4 exam2 数値 8 4.2  
2 gender 文字 8    
5 hwgrade 文字 8    
1 subject 数値 8    

それぞれの6つの属性を簡単に見ていきましょう。

変数名 変数名については「基本的なSASプログラムの要件」ですでに説明されているので、それ以上付け加えることはありません。つまり、変数名がSASの名前付け規則に従っている限り問題ありません。まだ覚えていない場合は、変数名は1~32文字で、最初は英大文字、英小文字、またはアンダースコア(_)で始まり、その後は数字、文字、アンダースコアを任意の組み合わせで使用できます。

変数の型 前述のように、変数は文字型または数値型のいずれかに識別されます。名前のような文字型変数には、キーボードで入力できる任意の文字(文字、数字、!@#$%^&()_+…など)を含めることができます。一方、id、height、weightのような数値型変数には、0~9の数字、正符号(+)、負符号(-)、小数点(.)、および指数表記のEだけを含めることができます。

上のデータセットで気づいたことかもしれませんが、データセットにはデータが欠損している部分があります。subject IDが7の人のジェンダーが欠落し、subject IDが4の人の試験2の点数が欠落しています。SASは欠損データを扱えるので問題ありません。値が欠損している場合、SASが表示する内容は変数の型によって異なります。上のデータセットが示すように、SASは文字値の欠損値を空白スペースで、数値の欠損値をピリオド(.) で表示します。

変数の長さ 変数の長さは、コンピューターのメモリ内にその変数を格納するために使用されるバイト数を示します。文字型変数は32,767バイトまで格納できます。私たちのデータセットでは、変数genderの長さは7文字で、したがって7バイトの記憶領域を使用しています。すべての数値型変数のデフォルトの長さは8です。数値は長さを指定しない限り、浮動小数点数として8バイトの記憶領域に格納されます。したがって、このデータセットの数値型変数の長さがすべて8であることは一般的なことです。

変数のフォーマット(出力形式)とインフォーマット(入力形式) これらの2つの属性については、このコースの後半でより詳しく学習します。今のところ、変数のフォーマットはレポートでその変数の値を表示する方法をSASに指示するものであることを覚えておいてください。例えば、値5391を$5391.00または5,391のように表示するよう指示できます。一方、インフォーマットは特殊な形式のデータ値を標準のSAS値として読み込む方法を指定します。

変数ラベル 必要に応じて、最大256文字の説明的なラベルを変数に付けることができます。デフォルトでは、SASの標準レポートの多くが変数名で変数を識別します。代わりに変数にラベルを割り当てることで、変数に関するより説明的な情報を表示するようにできます。上のデータセットでは、変数exam1にはラベル “Exam 1 grade”が付いています。

今のところ、SAS変数についてこれだけ知っていれば十分です!以降では具体的なプログラムを見ていきましょう。そうすれば、SASプログラムを書いて実行できるようになります。

SASプログラムのフォーマットとコメントに関するガイドライン#

使用されるプログラミング言語に関係なく、すべての優れたプログラマーが従うべき基本的な適切なプログラミングの習慣がいくつかあります。その2つが、プログラムのフォーマットとコメントに関するものです。このレッスンを終える前に、SASプログラムのフォーマットとコメントに関するいくつかのガイドラインを確認しましょう。このコース(そしてそれ以降も!)を通して、以下のガイドラインに従うことが求められます。

/********************
This SAS program blah, blah, blah, ..........
*********************/
 
*Convert Fahrenheit to celsius;

前述したように、コメント文はプログラムを処理することなく記録ができます。区切り付きのコメントは前方スラッシュ-アスタリスク/*で始まり、アスタリスク-後方スラッシュ*/で終わり、大きなブロックのコメントを作成するのに便利です。区切り記号内のすべてのテキストは無視されます。別の種類のコメントは、アスタリスク(*)で始まりセミコロン(;)で終わります。例:

SASはフリーフォーマットのコードを許可しますが、優れたSASプログラムは整然と構成されています。

/******************
Filename: /home/lsimon/stat597c/sas/temp.sas
Written by: laura J. Simon
Date: January 9, 1996
 
This program calculates the average number of days 
that the tempreture falls below freezing in State College, PA
 
Input: C:\data\temps.dat
Output: average number of days below freezing by month 
        stored in C:\data\temps.ssd
******************/

すべてのSASプログラムは、プログラムヘッダーから始まるべきであり、アスタリスク等で強調表示します。プログラムヘッダーには上の例のように、ファイル名、プログラムの作成者、作成日、プログラムの主な目的、入力と出力を明確に説明するテキストを記載します。

重要なデータステップまたはPROCステップごとに、そのステップの主な目的を説明する複数行のコメント(ブロックコメント)を、アスタリスクで強調して前に記載しておきましょう。ブロックコメントには、変数名や、そのコードブロックの入出力などの重要な情報も含めておきます。

1行のコードに関するコメントも有用です。例えば下の例のように、式の計算内容の説明、新しい変数とその計算方法の説明、特定の値に基づいてデータセットをサブセットにする理由の説明などを記載します。

SASプログラム内の各PROCステップまたはデータステップの間は、少なくとも1行空けるようにします。

data grade;
  set grade;
  exam_avg = (exam1 + exam2) / 2; *Calculate the average exam grade;
run;

proc print data = grade;
run;

必須ではありませんが、コードを視覚的に見やすくするのに役立つため、必要に応じてライブラリや変数名など強調したい箇所やその一部を大文字で書くとよいでしょう。

演習#

  1. 以下のプログラムを実行してください。これは何を行うものでしょうか?

proc print data = sashelp.heart (obs=10);
run;

proc means data = sashelp.heart;
  var height weight;
run;
  1. 以下のプログラムを実行してください。いくつのデータステップ、PROCステップが含まれ、どのステップが実行されるでしょうか?

data work.quant;
  set sashelp.heart; /* Read in from the heart datset */
  keep height weight diastolic systolic; *Only keep these variable 
                                      in the new dataset;
run;
proc print data = work.quant (obs=10);
run;
/*
proc means data = work.quant min q1 median q3 max mean std;
run;
*/
  1. データセット sashelp.heart でPROC CONTENTSを実行してください。データセットのオブザベーション数はいくつですか?

  2. 以下のプログラムを実行してください。「CurrentDate」の値は何でしたか? (この値はSASが基準日とする1960/1/1からの経過日数です)

data work.date;
  CurrentDate = today();
run;
   
proc print data = work.date;
run;