演習の回答例#

SASの画面構成#

前のサンプルプログラムとCharm City Circulator Ridershipデータセットを使用し、以下の変更を加えてSASの動作を試してみてください。

  1. 属性マップデータセット palette を使用して、元の色とは異なる色に変更してください。SASの色のリストは https://support.sas.com/content/dam/SAS/support/en/books/pro-template-made-easy-a-guide-for-sas-users/62007_Appendix.pdf を参照してください。

  2. 表示する曜日を変更し、"Saturday"ではなく"Sunday"を表示するようにしてください。

  3. proc sgpanelseriesscatter に変更して、線グラフから散布図に変更してください。

%let working_directory = data; *Replace data with your path to your 
                                directory containing the dataset;

proc import datafile = "&working_directory/Charm_City_Circulator_Ridership.csv" 
  out = circ dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

proc sort data = circ;
  by day date daily;
run;

proc transpose data = circ out = long (rename=(_NAME_ = var col1 = number));
  var orangeboardings -- banneraverage;
  by day date daily;
run;

data long2;
  set long;
  var = tranwrd(var, 'Board', '_Board');
  var = tranwrd(var, 'Alight', '_Alight');
  var = tranwrd(var, 'Average', '_Average');
  line = scan(var, 1, '_');
  type = scan(var, 2, '_');
  drop var;
run;

data avg;
  set long2;
  where (type = "Average");
run;

data palette;
  input id $ value $ linecolor $;
  markercolor = linecolor;
  datalines;
lc banner red
lc green yellow
lc orange darkblue
lc purple brown
;
run;

proc sgpanel data = avg dattrmap=palette; 
  where day in ("Monday" "Tuesday" "Friday" "Sunday");
  panelby day;
  scatter Y = number X = date / group = line attrid = lc;
run;
SAS 出力
SGPanel プロシジャ

基本的なSASプログラム#

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

PROC PRINT DATA = sashelp.heart (OBS=10);
RUN;
PROC MEANS DATA = sashelp.heart;
  VAR height weight;
RUN;
proc print data = sashelp.heart (obs=10);
run;

proc means data = sashelp.heart;
  var height weight;
run;
SAS 出力

SAS システム

OBS Status DeathCause AgeCHDdiag Sex AgeAtStart Height Weight Diastolic Systolic MRW Smoking AgeAtDeath Cholesterol Chol_Status BP_Status Weight_Status Smoking_Status
1 Dead Other . Female 29 62.50 140 78 124 121 0 55 .   Normal Overweight Non-smoker
2 Dead Cancer . Female 41 59.75 194 92 144 183 0 57 181 Desirable High Overweight Non-smoker
3 Alive   . Female 57 62.25 132 90 170 114 10 . 250 High High Overweight Moderate (6-15)
4 Alive   . Female 39 65.75 158 80 128 123 0 . 242 High Normal Overweight Non-smoker
5 Alive   . Male 42 66.00 156 76 110 116 20 . 281 High Optimal Overweight Heavy (16-25)
6 Alive   . Female 58 61.75 131 92 176 117 0 . 196 Desirable High Overweight Non-smoker
7 Alive   . Female 36 64.75 136 80 112 110 15 . 196 Desirable Normal Overweight Moderate (6-15)
8 Dead Other . Male 53 65.50 130 80 114 99 0 77 276 High Normal Normal Non-smoker
9 Alive   . Male 35 71.00 194 68 132 124 0 . 211 Borderline Normal Overweight Non-smoker
10 Dead Cerebral Vascular Disease . Male 52 62.50 129 78 124 106 5 82 284 High Normal Normal Light (1-5)

SAS システム

MEANS プロシジャ

変数 N 平均 標準偏差 最小値 最大値
Height
Weight
5203
5203
64.8131847
153.0866808
3.5827074
28.9154261
51.5000000
67.0000000
76.5000000
300.0000000

このプログラムはデータセットsashelp.heartの先頭10行と、変数「Height」と 「Weight」の要約統計量 N (サンプルサイズ), 平均, 標準偏差, 最小値, 最大値を出力します。

  1. 以下のプログラムを実行してください。いくつのDATAステップ、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;
*/
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;
*/
SAS 出力

SAS システム

OBS Height Weight Diastolic Systolic
1 62.50 140 78 124
2 59.75 194 92 144
3 62.25 132 90 170
4 65.75 158 80 128
5 66.00 156 76 110
6 61.75 131 92 176
7 64.75 136 80 112
8 65.50 130 80 114
9 71.00 194 68 132
10 62.50 129 78 124

データステップは1つ、PROCステップは2つあります。しかし最後のPROC MEANSはコメントアウトされているため実行されません。

  1. データセット sashelp.heart でPROC CONTENTSを実行してください。データセットのオブザベーション数はいくつですか?

proc contents data = sashelp.heart;
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 SASHELP.HEART オブザベーション数 5209
メンバータイプ DATA 変数の数 17
エンジン V9 インデックス数 0
作成日時 2020/08/06 01:11:21 オブザベーションのバッファ長 168
更新日時 2020/08/06 01:11:21 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル Framingham Heart Study    
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード us-ascii ASCII (ANSI)    
エンジン/ホスト関連情報
データセットのページサイズ 65536
データセットのページ数 14
データページの先頭 1
ページごとの最大OBS数 389
先頭ページのOBS数 365
データセットの修復数 0
ファイル名 /pbr/sfw/sas/940/SASFoundation/9.4/sashelp/heart.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 83658455
アクセス権限 rw-r--r--
所有者名 odaowner
ファイルサイズ 960KB
ファイルサイズ (バイト) 983040
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ ラベル
12 AgeAtDeath 数値 8 Age at Death
5 AgeAtStart 数値 8 Age at Start
3 AgeCHDdiag 数値 8 Age CHD Diagnosed
15 BP_Status 文字 7 Blood Pressure Status
14 Chol_Status 文字 10 Cholesterol Status
13 Cholesterol 数値 8  
2 DeathCause 文字 26 Cause of Death
8 Diastolic 数値 8  
6 Height 数値 8  
10 MRW 数値 8 Metropolitan Relative Weight
4 Sex 文字 6  
11 Smoking 数値 8  
17 Smoking_Status 文字 17 Smoking Status
1 Status 文字 5  
9 Systolic 数値 8  
7 Weight 数値 8  
16 Weight_Status 文字 11 Weight Status

データセットには5209オブザベーション(行)があります。

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

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

proc print data = work.date;
  format currentdate mmddyy10.;
run;
SAS 出力

SAS システム

OBS CurrentDate
1 23533

SAS システム

OBS CurrentDate
1 06/06/2024

「CurrentDate」の値はプログラムを実行した日によります。私は2024/06/06に実行したので値は23533で、1960/1/1から23533日です。

データの入出力#

  1. PROC IMPORT を使用して、Youth_Tobacco_Survey_YTS_Data.csv を読み込み、それに youth という名前を付けます。

proc import datafile = "/folders/myfolders/SAS_Notes/data/Youth_Tobacco_Survey_YTS_Data.csv"
            out = youth dbms = csv replace;
  getnames = yes;
  guessingrows = 500;
run;

proc print data = youth (obs=5);
run;
SAS 出力

SAS システム

OBS YEAR LocationAbbr LocationDesc TopicType TopicDesc MeasureDesc DataSource Response Data_Value_Unit Data_Value_Type Data_Value Data_Value_Footnote_Symbol Data_Value_Footnote Data_Value_Std_Err Low_Confidence_Limit High_Confidence_Limit Sample_Size Gender Race Age Education GeoLocation TopicTypeId TopicId MeasureId StratificationID1 StratificationID2 StratificationID3 StratificationID4 SubMeasureID DisplayOrder
1 2015 AZ Arizona Tobacco Use - Survey Data Cessation (Youth) Percent of Current Smokers Who Want to Quit YTS   % Percentage . * Data in these cells have been suppressed because of a small sample size . . . . Overall All Races All Ages Middle School (34.865970280000454, -111.76381127699972) BEH 105BEH 170CES 1GEN 8AGE 6RAC 1EDU YTS01 1
2 2015 AZ Arizona Tobacco Use - Survey Data Cessation (Youth) Percent of Current Smokers Who Want to Quit YTS   % Percentage . * Data in these cells have been suppressed because of a small sample size . . . . Male All Races All Ages Middle School (34.865970280000454, -111.76381127699972) BEH 105BEH 170CES 2GEN 8AGE 6RAC 1EDU YTS02 2
3 2015 AZ Arizona Tobacco Use - Survey Data Cessation (Youth) Percent of Current Smokers Who Want to Quit YTS   % Percentage . * Data in these cells have been suppressed because of a small sample size . . . . Female All Races All Ages Middle School (34.865970280000454, -111.76381127699972) BEH 105BEH 170CES 3GEN 8AGE 6RAC 1EDU YTS03 3
4 2015 AZ Arizona Tobacco Use - Survey Data Cessation (Youth) Quit Attempt in Past Year Among Current Cigarette Smokers YTS   % Percentage . * Data in these cells have been suppressed because of a small sample size . . . . Overall All Races All Ages Middle School (34.865970280000454, -111.76381127699972) BEH 105BEH 169QUA 1GEN 8AGE 6RAC 1EDU YTS04 4
5 2015 AZ Arizona Tobacco Use - Survey Data Cessation (Youth) Quit Attempt in Past Year Among Current Cigarette Smokers YTS   % Percentage . * Data in these cells have been suppressed because of a small sample size . . . . Male All Races All Ages Middle School (34.865970280000454, -111.76381127699972) BEH 105BEH 169QUA 2GEN 8AGE 6RAC 1EDU YTS05 5
  1. READMEに記載のリンクからMonumentsデータセット、Monuments.xlsxをダウンロードします。PROC IMPORTを使ってデータセットを読み込み、monという名前で出力します。

proc import datafile = "/folders/myfolders/SAS_Notes/data/Monuments.xlsx"
            out = mon dbms = xlsx replace;
  getnames = yes;
run;

proc print data = mon (obs=5);
run;
SAS 出力

SAS システム

OBS name zipCode neighborhood councilDistrict policeDistrict Location 1
1 James Cardinal Gibbons 21201 Downtown 11 CENTRAL 408 CHARLES ST Baltimore, MD
2 The Battle Monument 21202 Downtown 11 CENTRAL  
3 Negro Heroes of the U.S Monument 21202 Downtown 11 CENTRAL  
4 Star Bangled Banner 21202 Downtown 11 CENTRAL 100 HOLLIDAY ST Baltimore, MD
5 Flame at the Holocaust Monument 21202 Downtown 11 CENTRAL 50 MARKET PL Baltimore, MD
  1. DATALINESを使って以下の列フォーマットデータを読み込み、PROC PRINTを使って結果を出力するDATAステップを書きます。このデータセットには、フランスのIlle-et-Vilaineにおける食道癌の情報が含まれています。変数は

    • 年齢層

    • アルコール消費量

    • タバコ消費量

    • 症例数

    • コントロール数

データを読み込むためにDATAステップを書いて結果を表示させます。注意: 最初の行は列を数えるためのものです。各数値に5をかけたものが列番号になります。

----1----2----3----4----5----6----7----8
75+ 0-39g/day 0-9g/day      1        18
75+ 0-39g/day    10-19      2         6
75+ 0-39g/day      30+      1         3
75+     40-79 0-9g/day      2         5
75+     40-79    10-19      1         3
75+     40-79    20-29      0         3
75+     40-79      30+      1         1
75+    80-119 0-9g/day      1         1
75+    80-119    10-19      1         1
75+      120+ 0-9g/day      2         2
75+      120+    10-19      1         1
data eso;
  input aggrp $ 1-3 alc $ 5-13 smoke $ 15-22 ncases 29 ncontrl 38-39;
  datalines;
75+ 0-39g/day 0-9g/day      1        18
75+ 0-39g/day    10-19      2         6
75+ 0-39g/day      30+      1         3
75+     40-79 0-9g/day      2         5
75+     40-79    10-19      1         3
75+     40-79    20-29      0         3
75+     40-79      30+      1         1
75+    80-119 0-9g/day      1         1
75+    80-119    10-19      1         1
75+      120+ 0-9g/day      2         2
75+      120+    10-19      1         1
;
run;

proc print data=eso;
run;
SAS 出力

SAS システム

OBS aggrp alc smoke ncases ncontrl
1 75+ 0-39g/day 0-9g/day 1 18
2 75+ 0-39g/day 10-19 2 6
3 75+ 0-39g/day 30+ 1 3
4 75+ 40-79 0-9g/day 2 5
5 75+ 40-79 10-19 1 3
6 75+ 40-79 20-29 0 3
7 75+ 40-79 30+ 1 1
8 75+ 80-119 0-9g/day 1 1
9 75+ 80-119 10-19 1 1
10 75+ 120+ 0-9g/day 2 2
11 75+ 120+ 10-19 1 1

SAS変数と代入ステートメント#

  1. 次のSASデータステップを使って、新しい変数「Grade」と「Course」を以下の定義に従って作成してください。

data school; 
   input Age Quiz : $1. Midterm Final;
   /* ここにステートメントを追加 */
datalines;
12 A 92 95  
12 B 88 88
13 C 78 75
13 A 92 93
12 F 55 62
13 B 88 82
;

If-Then-Elseステートメントを使って新しい2つの変数を作成してください。

  • Grade(数値)の値は、Ageが12の場合は6、Ageが13の場合は8となります。

  • クイズの成績には以下の数値が対応しています: A=95、B=85、C=75、D=70、F=65
    この情報を使って、コースの成績「Course」(クイズ「Quiz」20%、中間試験「Midterm」30%、期末試験「Final」50%の加重平均)を計算してください。

data school;
  input Age Quiz : $1. Midterm Final;
  if Age = 12 then Grade = 6;
  else if AGE = 13 then Grade = 8;
  if quiz = "A" theN Course = 0.2*95 + 0.3*midterm + 0.5*final;
  else if quiz = "B" then Course = 0.2*85 + 0.3*midterm + 0.5*final;
  else if quiz = "C" then Course = 0.2*75 + 0.3*midterm + 0.5*final;
  else if quiz = "D" then Course = 0.2*70 + 0.3*midterm + 0.5*final;
  else if quiz = "F" then Course = 0.2*65 + 0.3*midterm + 0.5*final;
  datalines;
12 A 92 95
12 B 88 88
13 C 78 75
13 A 92 93
12 F 55 62
13 B 88 82
;
run;

proc print data = school;
run;
SAS 出力

SAS システム

OBS Age Quiz Midterm Final Grade Course
1 12 A 92 95 6 94.1
2 12 B 88 88 6 87.4
3 13 C 78 75 8 75.9
4 13 A 92 93 8 93.1
5 12 F 55 62 6 60.5
6 13 B 88 82 8 84.4

データの操作#

  1. データセットsashelp.heartから一時SASデータセットheartを作成してください。(ライブラリsashelpは、SASに同梱された永久ライブラリです)

data heart;
  set sashelp.heart;
run;
13                                                        SAS システム               2024年 6月 6日 木曜日 09時33分00秒

223        ods listing close;ods html5 (id=saspy_internal) file=_tomods1 options(bitmap_mode='inline') device=svg style=HTMLBlue;
223      ! ods graphics on / outputfmt=png;
224        
225        options notes ;
226        data heart;
227          set sashelp.heart;
228        run;

NOTE: データセットSASHELP.HEARTから5209オブザベーションを読み込みました。
NOTE: データセットWORK.HEARTは5209オブザベーション、17変数です。
NOTE: DATA ステートメント処理(合計処理時間):
      処理時間           0.00 秒
      ユーザーCPU時間    0.00 秒
      システムCPU時間    0.00 秒
      メモリ             2185.21k
      OSメモリ           23724.00k
      タイムスタンプ     2024/06/06 午前09:35:26
      ステップ数                        10  スイッチ数  2
      ページフォルト回数                0
      ページリクレーム回数              259
      ページスワップ回数                0
      自発的コンテキストスイッチ回数    9
      非自発的コンテキストスイッチ回数  0
      ブロック入力操作回数              0
      ブロック出力操作回数              1800
      

229        
230        
231        ods html5 (id=saspy_internal) close;ods listing;
232        

14                                                        SAS システム               2024年 6月 6日 木曜日 09時33分00秒

233        
  1. PROC CONTENTSを実行してデータセットheartのディスクリプタ部を表示してください。このデータセットにはいくつのオブザベーション(行)と変数(列)がありますか?

proc contents data = heart;
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.HEART オブザベーション数 5209
メンバータイプ DATA 変数の数 17
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:35:27 オブザベーションのバッファ長 168
更新日時 2024/06/06 09:35:27 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 7
データページの先頭 1
ページごとの最大OBS数 779
先頭ページのOBS数 755
データセットの修復数 0
ファイル名 /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 536881018
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 1MB
ファイルサイズ (バイト) 1048576
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ ラベル
12 AgeAtDeath 数値 8 Age at Death
5 AgeAtStart 数値 8 Age at Start
3 AgeCHDdiag 数値 8 Age CHD Diagnosed
15 BP_Status 文字 7 Blood Pressure Status
14 Chol_Status 文字 10 Cholesterol Status
13 Cholesterol 数値 8  
2 DeathCause 文字 26 Cause of Death
8 Diastolic 数値 8  
6 Height 数値 8  
10 MRW 数値 8 Metropolitan Relative Weight
4 Sex 文字 6  
11 Smoking 数値 8  
17 Smoking_Status 文字 17 Smoking Status
1 Status 文字 5  
9 Systolic 数値 8  
7 Weight 数値 8  
16 Weight_Status 文字 11 Weight Status

5209オブザベーション(行)と17変数(列)

  1. データセットオプションのRENAME=オプションを使って、Statusconditionに変更します。PROC CONTENTSの変数の一覧を表示して、名前が変更されたことを確認してください。

data heart2 (rename = (status = condition));
  set heart;
run;

proc contents data = heart2;
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.HEART2 オブザベーション数 5209
メンバータイプ DATA 変数の数 17
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:36:02 オブザベーションのバッファ長 168
更新日時 2024/06/06 09:36:02 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 7
データページの先頭 1
ページごとの最大OBS数 779
先頭ページのOBS数 755
データセットの修復数 0
ファイル名 /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart2.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 536875385
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 1MB
ファイルサイズ (バイト) 1048576
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ ラベル
12 AgeAtDeath 数値 8 Age at Death
5 AgeAtStart 数値 8 Age at Start
3 AgeCHDdiag 数値 8 Age CHD Diagnosed
15 BP_Status 文字 7 Blood Pressure Status
14 Chol_Status 文字 10 Cholesterol Status
13 Cholesterol 数値 8  
2 DeathCause 文字 26 Cause of Death
8 Diastolic 数値 8  
6 Height 数値 8  
10 MRW 数値 8 Metropolitan Relative Weight
4 Sex 文字 6  
11 Smoking 数値 8  
17 Smoking_Status 文字 17 Smoking Status
9 Systolic 数値 8  
7 Weight 数値 8  
16 Weight_Status 文字 11 Weight Status
1 condition 文字 5  
  1. データセットheartからサブセットheart_subを作成し、heightweightdiastolicの列のみを含めます。heart_subのオブザベーション(行)と変数(列)はいくつですか?heart_subの最初の5行を出力してください。

data heart_sub;
  set heart;
  keep height weight diastolic;
run;

proc contents data = heart_sub;
run;

proc print data = heart_sub(obs=5);
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.HEART_SUB オブザベーション数 5209
メンバータイプ DATA 変数の数 3
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:36:18 オブザベーションのバッファ長 24
更新日時 2024/06/06 09:36:18 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 1
データページの先頭 1
ページごとの最大OBS数 5431
先頭ページのOBS数 5209
データセットの修復数 0
ファイル名 /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart_sub.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 536875977
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 256KB
ファイルサイズ (バイト) 262144
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ
3 Diastolic 数値 8
1 Height 数値 8
2 Weight 数値 8

SAS システム

OBS Height Weight Diastolic
1 62.50 140 78
2 59.75 194 92
3 62.25 132 90
4 65.75 158 80
5 66.00 156 76

データセットheart_sub は5209行 3列

  1. データセットheartから、拡張期血圧(diastolic)が90を超える被験者の行をデータセットheart_sub2にサブセットします。何オブザベーションありますか?heart_sub2の最初の5行を出力してください。

data heart_sub2;
  set heart;
  where diastolic > 90;
run;

proc contents data = heart_sub2;
run;

proc print data = heart_sub2(obs=5);
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.HEART_SUB2 オブザベーション数 1366
メンバータイプ DATA 変数の数 17
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:36:36 オブザベーションのバッファ長 168
更新日時 2024/06/06 09:36:36 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 2
データページの先頭 1
ページごとの最大OBS数 779
先頭ページのOBS数 755
データセットの修復数 0
ファイル名 /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart_sub2.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 536898439
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 384KB
ファイルサイズ (バイト) 393216
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ ラベル
12 AgeAtDeath 数値 8 Age at Death
5 AgeAtStart 数値 8 Age at Start
3 AgeCHDdiag 数値 8 Age CHD Diagnosed
15 BP_Status 文字 7 Blood Pressure Status
14 Chol_Status 文字 10 Cholesterol Status
13 Cholesterol 数値 8  
2 DeathCause 文字 26 Cause of Death
8 Diastolic 数値 8  
6 Height 数値 8  
10 MRW 数値 8 Metropolitan Relative Weight
4 Sex 文字 6  
11 Smoking 数値 8  
17 Smoking_Status 文字 17 Smoking Status
1 Status 文字 5  
9 Systolic 数値 8  
7 Weight 数値 8  
16 Weight_Status 文字 11 Weight Status

SAS システム

OBS Status DeathCause AgeCHDdiag Sex AgeAtStart Height Weight Diastolic Systolic MRW Smoking AgeAtDeath Cholesterol Chol_Status BP_Status Weight_Status Smoking_Status
1 Dead Cancer . Female 41 59.75 194 92 144 183 0 57 181 Desirable High Overweight Non-smoker
2 Alive   . Female 58 61.75 131 92 176 117 0 . 196 Desirable High Overweight Non-smoker
3 Alive   . Female 42 67.75 162 96 138 119 1 . 200 Borderline High Overweight Light (1-5)
4 Dead Coronary Heart Disease 71 Female 49 60.50 153 110 196 140 5 73 221 Borderline High Overweight Light (1-5)
5 Alive   43 Male 33 66.50 172 106 146 127 0 . 247 High High Overweight Non-smoker

拡張期血圧(diastolic)が90より高いオブザベーションは1366

  1. データセットheartから、拡張期血圧が90以下で体重が180ポンド以上の被験者の行をデータセットheart_sub3にサブセットします。何オブザベーションありますか?heart_sub3の最初の5行を出力してください。

data heart_sub3;
  set heart;
  where diastolic <= 90 and weight > 180;
run;

proc contents data = heart_sub3;
run;

proc print data = heart_sub3(obs=5);
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.HEART_SUB3 オブザベーション数 481
メンバータイプ DATA 変数の数 17
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:37:06 オブザベーションのバッファ長 168
更新日時 2024/06/06 09:37:06 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 1
データページの先頭 1
ページごとの最大OBS数 779
先頭ページのOBS数 481
データセットの修復数 0
ファイル名 /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart_sub3.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 536898451
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 256KB
ファイルサイズ (バイト) 262144
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ ラベル
12 AgeAtDeath 数値 8 Age at Death
5 AgeAtStart 数値 8 Age at Start
3 AgeCHDdiag 数値 8 Age CHD Diagnosed
15 BP_Status 文字 7 Blood Pressure Status
14 Chol_Status 文字 10 Cholesterol Status
13 Cholesterol 数値 8  
2 DeathCause 文字 26 Cause of Death
8 Diastolic 数値 8  
6 Height 数値 8  
10 MRW 数値 8 Metropolitan Relative Weight
4 Sex 文字 6  
11 Smoking 数値 8  
17 Smoking_Status 文字 17 Smoking Status
1 Status 文字 5  
9 Systolic 数値 8  
7 Weight 数値 8  
16 Weight_Status 文字 11 Weight Status

SAS システム

OBS Status DeathCause AgeCHDdiag Sex AgeAtStart Height Weight Diastolic Systolic MRW Smoking AgeAtDeath Cholesterol Chol_Status BP_Status Weight_Status Smoking_Status
1 Alive   . Male 35 71.00 194 68 132 124 0 . 211 Borderline Normal Overweight Non-smoker
2 Alive   . Female 50 67.50 185 88 150 136 15 . 228 Borderline High Overweight Moderate (6-15)
3 Alive   . Male 42 72.25 182 78 136 113 0 . 221 Borderline Normal Overweight Non-smoker
4 Alive   68 Male 40 70.00 189 78 124 124 0 . 319 High Normal Overweight Non-smoker
5 Alive   68 Male 40 70.00 195 76 132 128 20 . 205 Borderline Normal Overweight Heavy (16-25)

拡張期血圧が90以下で体重が180ポンド以上なのは481オブザベーション

  1. データセットheartから重度の喫煙者(Smoking_Status = “Heavy (16-25)”)について、weightsystoliccholesterolの列のみを含むサブセットを作成します。このサブセットをheart_subに保存します。このデータセットののオブザベーション(行)と変数(列)はいくつですか?heart_subの最初の5行を出力してください。

data heart_sub;
  set heart;
  where Smoking_Status = "Heavy (16-25)";
  keep weight systolic cholesterol;
run;

proc contents data = heart_sub;
run;

proc print data = heart_sub(obs=5);
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.HEART_SUB オブザベーション数 1046
メンバータイプ DATA 変数の数 3
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:37:25 オブザベーションのバッファ長 24
更新日時 2024/06/06 09:37:25 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 1
データページの先頭 1
ページごとの最大OBS数 5431
先頭ページのOBS数 1046
データセットの修復数 0
ファイル名 /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/heart_sub.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 536875336
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 256KB
ファイルサイズ (バイト) 262144
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ
3 Cholesterol 数値 8
2 Systolic 数値 8
1 Weight 数値 8

SAS システム

OBS Weight Systolic Cholesterol
1 156 110 281
2 195 132 205
3 181 144 223
4 152 144 263
5 196 128 .

データセットheart_subは1046オブザベーション、3変数

  1. データセットheart_subの行を、コレステロール値の降順で並べ替えます。並べ替えたデータセットの最初の5行を出力してください。

proc sort data = heart_sub out = heart_sub_srt;
  by descending cholesterol;
run;

proc print data = heart_sub_srt(obs=5);
run;
SAS 出力

SAS システム

OBS Weight Systolic Cholesterol
1 169 155 568
2 205 154 534
3 194 150 429
4 104 122 392
5 137 185 368

データの要約#

  1. Baltimoreにはいくつの自転車レーンがありますか?各オブザベーション/行が異なる自転車レーンであると想定できます。

proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes.csv"
            out = bike dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

proc contents data = bike;
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.BIKE オブザベーション数 1631
メンバータイプ DATA 変数の数 9
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:38:03 オブザベーションのバッファ長 136
更新日時 2024/06/06 09:38:03 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 2
データページの先頭 1
ページごとの最大OBS数 962
先頭ページのOBS数 940
データセットの修復数 0
ファイル名 /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/bike.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 536873870
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 384KB
ファイルサイズ (バイト) 393216
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ 出力形式 入力形式
3 block 文字 29 $29. $29.
9 dateInstalled 数値 8 BEST12. BEST32.
8 length 数値 8 BEST12. BEST32.
2 name 文字 20 $20. $20.
5 numLanes 数値 8 BEST12. BEST32.
6 project 文字 25 $25. $25.
7 route 文字 13 $13. $13.
1 subType 文字 6 $6. $6.
4 type 文字 15 $15. $15.

自転車レーンの数は1631

  1. Baltimoreにある自転車レーンの総延長距離は(a)フィート数と(b)マイル数でいくらですか?(変数「length」が延長距離で単位はフィート、1マイルは5280フィート)

proc means data = bike sum;
  var length;
run;
SAS 出力

SAS システム

MEANS プロシジャ

分析変数 : length
合計
439447.59
data miles;
  length_mi = 439447.59 / 5280;
run;

proc print data = miles;
run;
SAS 出力

SAS システム

OBS length_mi
1 83.2287
  1. 自転車レーンの種類(type)は何種類ありますか?最も多い種類と(b)平均レーン長が最も長い種類はどれですか?

proc freq data = bike;
  table type;
run;

proc means data = bike noprint;
  class type;
  var length;
  output out = type_mean mean = length_mean;
run;

proc sort data = type_mean;
  by descending length_mean;
run;

proc print data = type_mean;
run;
SAS 出力

SAS システム

FREQ プロシジャ

type 度数 パーセント 累積
度数
累積
パーセント
欠損値の度数 = 9
BIKE BOULEVARD 49 3.02 49 3.02
BIKE LANE 621 38.29 670 41.31
CONTRAFLOW 13 0.80 683 42.11
SHARED BUS BIKE 39 2.40 722 44.51
SHARROW 589 36.31 1311 80.83
SIDEPATH 7 0.43 1318 81.26
SIGNED ROUTE 304 18.74 1622 100.00

SAS システム

OBS type _TYPE_ _FREQ_ length_mean
1 SIDEPATH 1 7 665.87751019
2 BIKE LANE 1 621 300.24183502
3 SHARED BUS BIKE 1 39 276.66575695
4   0 1622 269.48876975
5 SIGNED ROUTE 1 304 263.57986593
6 SHARROW 1 589 243.8718592
7 BIKE BOULEVARD 1 49 197.27815495
8 CONTRAFLOW 1 13 136.46646088

自転車レーンの種類は7(欠損値を含めた場合は8)、最も多い種類はbike laneで621、平均レーン長が最も長いのはsidepathで 665.88 ft.

  1. 自転車レーンはいくつのプロジェクト(project)に分かれていますか?最も平均レーン長が長いプロジェクトカテゴリはどれですか?

proc freq data = bike;
  table project;
run;

proc means data = bike noprint;
  class project;
  var length;
  output out = project_mean mean = length_mean;
run;

proc sort data = project_mean;
  by descending length_mean;
run;

proc print data = project_mean;
run;
SAS 出力

SAS システム

FREQ プロシジャ

project 度数 パーセント 累積
度数
累積
パーセント
欠損値の度数 = 74
CHARM CITY CIRCULATOR 39 2.50 39 2.50
COLLEGETOWN 339 21.77 378 24.28
COLLEGETOWN NETWORK 13 0.83 391 25.11
ENGINEERING CONSTRUCTION 12 0.77 403 25.88
GUILFORD AVE BIKE BLVD 49 3.15 452 29.03
MAINTENANCE 4 0.26 456 29.29
OPERATION ORANGE CONE 458 29.42 914 58.70
PARK HEIGHTS BIKE NETWORK 172 11.05 1086 69.75
PLANNING TRAFFIC 18 1.16 1104 70.91
SOUTHEAST BIKE NETWORK 323 20.75 1427 91.65
TRAFFIC 51 3.28 1478 94.93
TRAFFIC CALMING 79 5.07 1557 100.00

SAS システム

OBS project _TYPE_ _FREQ_ length_mean
1 MAINTENANCE 1 4 1942.1522856
2 ENGINEERING CONSTRUCTION 1 12 512.09762483
3 TRAFFIC 1 51 419.52878809
4 COLLEGETOWN 1 339 320.68363126
5 PARK HEIGHTS BIKE NETWORK 1 172 283.22519367
6 CHARM CITY CIRCULATOR 1 39 276.66575695
7   0 1557 272.0534698
8 TRAFFIC CALMING 1 79 268.53137627
9 OPERATION ORANGE CONE 1 458 250.07840273
10 COLLEGETOWN NETWORK 1 13 213.63728443
11 SOUTHEAST BIKE NETWORK 1 323 210.82827388
12 PLANNING TRAFFIC 1 18 209.42893827
13 GUILFORD AVE BIKE BLVD 1 49 197.27815495

プロジェクトの数は12(欠損値を含めると13)で、 maintenanceプロジェクトが平均レーン長が1942.15 ftで最も長い

  1. 設置された年ごとの自転車レーンの平均延長距離はどのくらいですか?(「dateInstalled」が0の場合は先に値を.としてください)

data bike;
  set bike;
  if dateinstalled = 0 then dateinstalled = .;
run;

proc means data = bike mean;
  class dateinstalled;
  var length;
run;
SAS 出力

SAS システム

MEANS プロシジャ

分析変数 : length
dateInstalled Obs 数 平均
2006 2 1469.35
2007 368 309.8903287
2008 206 249.4810027
2009 86 407.2947463
2010 625 245.6015777
2011 101 232.8127593
2012 107 271.4321825
2013 10 290.4263702
  1. 自転車レーンの長さ(length)の分布を(a)統計量、(b)グラフにより表してください。

proc univariate data = bike plots;
  var length;
run;
SAS 出力

SAS システム

UNIVARIATE プロシジャ

変数 : length

モーメント
N 1631 重み変数の合計 1631
平均 269.434449 合計 439447.587
標準偏差 277.706646 分散 77120.9813
歪度 5.1297861 尖度 43.3888947
無修正平方和 244109518 修正済平方和 125707200
変動係数 103.070208 平均の標準誤差 6.87637089
基本統計量
位置 ばらつき
平均 269.4344 標準偏差 277.70665
中央値 200.3027 分散 77121
最頻値 . 範囲 3749
    四分位範囲 217.16479
 位置の検定 H0: Mu0=0
検定 統計量 p 値
Student の t 検定 t 39.18265 Pr > |t| <.0001
符号検定 M 815 Pr >= |M| <.0001
符号付順位検定 S 664632.5 Pr >= |S| <.0001
 分位点 (定義 5)
水準 分位点
100% 最大値 3749.3226
99% 1341.8291
95% 664.2305
90% 502.2232
75% Q3 341.1493
50% 中央値 200.3027
25% Q1 123.9845
10% 67.8206
5% 45.3655
1% 14.8383
0% 最小値 0.0000
極値
最小値 最大値
Obs Obs
0.00000 4 2536.73 1284
5.51372 523 2715.20 1344
6.85712 724 2916.53 903
8.16243 490 3467.68 904
9.71914 595 3749.32 3
length のプロット
  1. 自転車レーンの長さの分布を(a)type、(b)numLanesごとに層別化して、統計量とグラフに表してください。

proc means data=bike mean std;
  class type;
  var length;
run;

proc sgplot data = bike;
  vbox length / category = type;
run;

proc means data=bike mean std;
  class numlanes;
  var length;
run;

proc sgplot data = bike;
  vbox length / category = numlanes;
run;
SAS 出力

SAS システム

MEANS プロシジャ

分析変数 : length
type Obs 数 平均 標準偏差
BIKE BOULEVARD 49 197.2781549 113.1318019
BIKE LANE 621 300.2418350 314.6605599
CONTRAFLOW 13 136.4664609 48.5165725
SHARED BUS BIKE 39 276.6657570 140.1811711
SHARROW 589 243.8718592 188.4222254
SIDEPATH 7 665.8775102 619.3894227
SIGNED ROUTE 304 263.5798659 347.8501541

SGPlot プロシジャ

SAS システム

MEANS プロシジャ

分析変数 : length
numLanes Obs 数 平均 標準偏差
0 21 308.3767969 201.5548096
1 900 277.9016282 317.8281529
2 710 257.5495894 218.6179448

SGPlot プロシジャ

フォーマットと日付#

  1. Freqプロシージャを使用して、bike lane 種類別の表を作成してください。

proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes.csv"
            out = bike dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

proc freq data = bike;
  table type;
run;
SAS 出力

SAS システム

FREQ プロシジャ

type 度数 パーセント 累積
度数
累積
パーセント
欠損値の度数 = 9
BIKE BOULEVARD 49 3.02 49 3.02
BIKE LANE 621 38.29 670 41.31
CONTRAFLOW 13 0.80 683 42.11
SHARED BUS BIKE 39 2.40 722 44.51
SHARROW 589 36.31 1311 80.83
SIDEPATH 7 0.43 1318 81.26
SIGNED ROUTE 304 18.74 1622 100.00
  1. bike lane について”SIDEPATH”, “BIKE BOULEVARD” と “BIKE LANE”はそのまま、その他は “ “とするフォーマットを作成し、Freqプロシージャでフォーマットを使用してbike lane種類別の表を作成してください。表はどのようになりましたか?

proc format;
   value $typefmt "SIDEPATH" = "SIDEPATH"
                   "BIKE BOULEVARD" = "BIKE BOULEVARD"
                   "BIKE LANE" = "BIKE LANE"
                   OTHER = " ";
run;

data bike2;
  set bike;
  format type $typefmt.;
run;

proc freq data = bike2;
  table type;
run;
SAS 出力

SAS システム

FREQ プロシジャ

type 度数 パーセント 累積
度数
累積
パーセント
欠損値の度数 = 954
BIKE BOULEVARD 49 7.24 49 7.24
BIKE LANE 621 91.73 670 98.97
SIDEPATH 7 1.03 677 100.00

“SIDEPATH”, “BIKE BOULEVARD” と “BIKE LANE”以外を欠損値にしたため、3つの水準の表となった。

  1. bike lane について”CONTRAFLOW”, “SHARED BUS BIKE”, “SHARROW”, “SIGNED ROUTE”はそのまま、その他は “OTHER”とするフォーマットを作成し、Freqプロシージャでフォーマットを使用してbike lane種類別の表を作成してください。

proc format;
  value $type2fmt "CONTRAFLOW" = "CONTRAFLOW"
                   "SHARED BUS BIKE" = "SHARED BUS BIKE"
                   "SHARROW" = "SHARROW"
                   "SIGNED ROUTE" = "SIGNED ROUTE"
                   "SIDEPATH", "BIKE BOULEVARD", "BIKE LANE" = "OTHER";
run;

data bike3;
  set bike;
  format type $type2fmt.;
run;

proc freq data = bike3;
  table type;
run;
SAS 出力

SAS システム

FREQ プロシジャ

type 度数 パーセント 累積
度数
累積
パーセント
欠損値の度数 = 9
OTHER 677 41.74 677 41.74
CONTRAFLOW 13 0.80 690 42.54
SHARED BUS BIKE 39 2.40 729 44.94
SHARROW 589 36.31 1318 81.26
SIGNED ROUTE 304 18.74 1622 100.00
  1. 以下の日付3つと時間を含むデータセットを読み込むようなデータステップのコードを作成してください。その後データセットを読めるような日時フォーマットを使用して結果に出力し、正しく読み込めたことを確認してください(SASドキュメントの日時フォーマット・インフォーマットのページを必要に応じ参照してください)。

data temp;
  input date1 /*informat1*/ +1 date2 /*informat2*/ +1
        date3 /*informat3*/ @32 time /*informat4*/;
  datalines;
2014/02/14 06Jan2018 4/5/2016   03:2:22
;
run;
data temp;
  input date1 yymmdd10. +1 date2 DATE9. +1
        date3 mmddyy8. @32 time time7.;
  datalines;
2014/02/14 06Jan2018 4/5/2016   03:2:22
;
run;

proc print data = temp;
  format date1 date2 date3 mmddyy10. time time7.;
run;
SAS 出力

SAS システム

OBS date1 date2 date3 time
1 02/14/2014 01/06/2018 04/05/2016 3:02:02

文字列関数#

  1. PROC IMPORTを使ってBaltimore cityの給与データセット Baltimore_City_Employee_Salaries_FY2015.csvを読み込んでください。

proc import datafile = "/folders/myfolders/SAS_Notes/data/Baltimore_City_Employee_Salaries_FY2015.csv"
            out = sal dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

proc print data = sal(obs=5);
run;
SAS 出力

SAS システム

OBS name JobTitle AgencyID Agency HireDate AnnualSalary GrossPay
1 Aaron,Patricia G Facilities/Office Services II A03031 OED-Employment Dev (031) 10/24/1979 55,314 53,626
2 Aaron,Petra L ASSISTANT STATE'S ATTORNEY A29045 States Attorneys Office (045) 09/25/2006 74,000 73,000
3 Abaineh,Yohannes T EPIDEMIOLOGIST A65026 HLTH-Health Department (026) 07/23/2009 64,500 64,404
4 Abbene,Anthony M POLICE OFFICER A99005 Police Department (005) 07/24/2013 46,309 59,620
5 Abbey,Emmanuel CONTRACT SERV SPEC II A40001 M-R Info Technology (001) 05/01/2013 60,060 54,060
  1. 一時データセット health_sal を作成し、そこには (大文字小文字を区別せずに) 職名「JobTitle」に “fire” が含まれるもののみを含めでください。

data health_sal;
  set sal;
  where index(lowcase(JobTitle), 'fire') > 0;
RUN;

proc print data=health_sal(obs=5);
  var JobTitle;
run;
SAS 出力

SAS システム

OBS JobTitle
1 EMT Firefighter Suppression
2 Fire Pump Operator Supp ALS
3 Firefighter/Paramedic Suppress
4 Fire Pump Operator Supp ALS
5 Firefighter Suppression
  1. 一時データセット trans を作成し、そこには (大文字小文字を区別して) “TRANS” が含まれるもののみを含めてください。

data trans;
  set sal;
  where index(JobTitle, 'TRANS') > 0;
run;

proc print data=trans(obs=5);
  var JobTitle;
run;
SAS 出力

SAS システム

OBS JobTitle
1 TRANSPORTATION ASSOC II
2 TAX TRANSFER CLERK I
3 GENL SUPT TRANSPORTATION MAINT
4 TAX TRANSFER CLERK I
5 TAX TRANSFER CLERK I
  1. Baltimoreの給与データで、名前に “abra” が含まれる人の職業は何ですか? 大文字小文字は区別しないでください。

proc print data=sal;
  var name JobTitle;
  where index(lowcase(name), 'abra') > 0;
run;
SAS 出力

SAS システム

OBS name JobTitle
26 Abraham,Donta D LABORER (Hourly)
27 Abraham,Santhosh ACCOUNTANT I
28 Abraham,Sharon M HOUSING INSPECTOR
29 Abrahams,Brandon A POLICE OFFICER TRAINEE
30 Abrams,Maria OFFICE SERVICES ASSISTANT II S
31 Abrams,Maxine COLLECTIONS REPRESENTATIVE I
32 Abrams,Terry RECREATION ARTS INSTRUCTOR
958 Bey,Abraham PROCUREMENT SPECIALIST II
3761 Elgamil,Abraham D AUDITOR SUPV
4545 Gatto,Abraham M POLICE OFFICER
11107 Schwartz,Abraham M GENERAL COUNSEL
12789 Velez,Abraham L POLICE OFFICER (EID)
  1. 警察局、消防局、保安官事務所のみを含む給与データセットのサブセットを作成します。変数「Agency」を使って(大文字小文字を区別した)文字列のマッチングを行ってください。このデータセットemerには何人の従業員が含まれていますか?

data emer;
  set sal;
  where index(agency, "Sheriff's Office") > 0 or
        index(agency, "Police Department") > 0 or
        index(agency, "Fire Department") > 0;
run;

proc print data=emer(obs=5);
  var agency;
run;
SAS 出力

SAS システム

OBS Agency
1 Police Department (005)
2 Fire Department (120)
3 Police Department (127)
4 Sheriff's Office (410)
5 Fire Department (465)
  1. データセットemer に変数「dept」を作成し、変数「Agency」から ‘ment’ または ‘ice’ の手前の部分を抽出してください。例えば、ment または ice までの文字を抜き出し (正規表現ではカッコで囲むとグループ化できます)、その後の文字は削除します。PROC FREQを使って変数「dept」の度数表を作成します。目的の部分文字列を抽出するには、次のようにします。

re = prxparse('/.*(ment|ice)/'); 
call prxsubstr(re, Agency, pos, len);
dept = substr(Agency, pos, len);
data emer;
  set emer;
  re = prxparse('/.*(ment|ice)/');
  call prxsubstr(re, Agency, pos, len);
  dept = substr(Agency, pos, len);
run;

proc freq data = emer;
  table dept;
run;
SAS 出力

SAS システム

FREQ プロシジャ

dept 度数 パーセント 累積
度数
累積
パーセント
Fire Department 1615 32.81 1615 32.81
Police Department 3097 62.92 4712 95.73
Sheriff's Office 210 4.27 4922 100.00

データクリーニング#

  1. PROC IMPORTを使ってBike_Lanes.csvをデータセットbikeとして読み込んでください。

proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes.csv"
            out = bike dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

proc print data = bike(obs=5);
run;
SAS 出力

SAS システム

OBS subType name block type numLanes project route length dateInstalled
1       BIKE BOULEVARD 1 GUILFORD AVE BIKE BLVD   435.73787702 0
2       SIDEPATH 1   NORTHERN 1024.6746249 2010
3       SIGNED ROUTE 1 SOUTHEAST BIKE NETWORK   3749.3226377 2010
4   HUNTINGDON PATH   SIDEPATH 1     0 0
5 STCLN EDMONDSON AVE 5300 BLK EDMONDSON AVE BIKE LANE 1 OPERATION ORANGE CONE   180.92546489 2011
  1. データセットbikeには何行あり、そのうち完全ケースは何行ありますか? ヒント: cmiss(of _ALL_)を使ってデータセットにおいて0/1の変数を作り、その0/1変数をPROC MEANSで合計することで完全ケースの数がわかります。

proc contents data = bike;
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.BIKE オブザベーション数 1631
メンバータイプ DATA 変数の数 9
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:46:16 オブザベーションのバッファ長 136
更新日時 2024/06/06 09:46:16 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 2
データページの先頭 1
ページごとの最大OBS数 962
先頭ページのOBS数 940
データセットの修復数 0
ファイル名 /saswork/SAS_work97C000003EF3_odaws01-apse1.oda.sas.com/SAS_work808B00003EF3_odaws01-apse1.oda.sas.com/bike.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 536875965
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 384KB
ファイルサイズ (バイト) 393216
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ 出力形式 入力形式
3 block 文字 29 $29. $29.
9 dateInstalled 数値 8 BEST12. BEST32.
8 length 数値 8 BEST12. BEST32.
2 name 文字 20 $20. $20.
5 numLanes 数値 8 BEST12. BEST32.
6 project 文字 25 $25. $25.
7 route 文字 13 $13. $13.
1 subType 文字 6 $6. $6.
4 type 文字 15 $15. $15.

データセットbikeは1631行です。

data bike;
  set bike;
  if cmiss(of _all_) > 0 then complete = 0;
  else complete = 1;
run;

proc print data = bike(obs=5);
run;

proc means data = bike sum;
  var complete;
run;
SAS 出力

SAS システム

OBS subType name block type numLanes project route length dateInstalled complete
1       BIKE BOULEVARD 1 GUILFORD AVE BIKE BLVD   435.73787702 0 0
2       SIDEPATH 1   NORTHERN 1024.6746249 2010 0
3       SIGNED ROUTE 1 SOUTHEAST BIKE NETWORK   3749.3226377 2010 0
4   HUNTINGDON PATH   SIDEPATH 1     0 0 0
5 STCLN EDMONDSON AVE 5300 BLK EDMONDSON AVE BIKE LANE 1 OPERATION ORANGE CONE   180.92546489 2011 0

SAS システム

MEANS プロシジャ

分析変数 : complete
合計
257.0000000
  1. 変数「route」が欠損していない行のみを抽出して一時データセットhave_routeを作成します。そして、PROC FREQを使って変数「subType」の度数表(欠損値を含む)を作成してください。

data have_route;
  set bike;
  where not missing(route);
run;

proc freq data = have_route;
  table subType / missing;
run;
SAS 出力

SAS システム

FREQ プロシジャ

subType 度数 パーセント 累積
度数
累積
パーセント
  1 0.28 1 0.28
STRALY 3 0.83 4 1.10
STRPRD 358 98.90 362 100.00

データ操作#

  1. Bike_Lanes_Wide.csvデータセットをPROC IMPORTでデータセットwideとして読み込み、最初の数行を出力してください。

proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes_Wide.csv"
            out = wide dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

proc contents data = wide;
run;

proc print data = wide(obs=5);
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 WORK.WIDE オブザベーション数 134
メンバータイプ DATA 変数の数 9
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:58:39 オブザベーションのバッファ長 141
更新日時 2024/06/06 09:58:39 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 1
データページの先頭 1
ページごとの最大OBS数 928
先頭ページのOBS数 134
データセットの修復数 0
ファイル名 /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/wide.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 2249148
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 256KB
ファイルサイズ (バイト) 262144
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ 出力形式 入力形式
2 BIKE BOULEVARD 文字 11 $11. $11.
3 BIKE LANE 文字 11 $11. $11.
4 CONTRAFLOW 文字 11 $11. $11.
9 NA 文字 11 $11. $11.
5 SHARED BUS BIKE 文字 11 $11. $11.
6 SHARROW 文字 11 $11. $11.
7 SIDEPATH 文字 11 $11. $11.
8 SIGNED ROUTE 文字 11 $11. $11.
1 name 文字 53 $53. $53.

SAS システム

OBS name BIKE BOULEVARD BIKE LANE CONTRAFLOW SHARED BUS BIKE SHARROW SIDEPATH SIGNED ROUTE NA
1 ALBEMARLE ST NA NA NA NA 109.9141727 NA 234.9190031 NA
2 ALICEANNA ST NA NA NA NA 250.7103035 NA NA NA
3 ARGONNE DR NA 1312.608373 NA NA NA NA NA NA
4 ART MUSEUM DR NA NA NA NA NA NA 277.6579871 NA
5 AUCHENTOROLY TERR NA 1341.82908 NA NA NA NA NA NA
  1. データセットwideをPROC TRANSPOSEまたはデータステップを使って縦持ち形式に変形してください。「name」以外のすべての列を対象にする必要があります。新しい2つの列「lanetype」(元の列名)と「the_length」(データ値)を持つ縦持ちのデータセットに変換します。変数「the_length」の’NA’の値は.に置き換え、数値型に変換します。

data long;
  set wide;
  array col{*} 'BIKE BOULEVARD'n -- NA;
  do i = 1 to dim(col);
    lanetype = vname(col[i]);
    if col[i] = 'NA' then the_length = .;
    else the_length = input(col[i], 20.7);
    output;
  end;
  drop 'BIKE BOULEVARD'n -- NA i;
run;

title 'Using a DATA step';
proc print data = long(obs=10);
run;

proc sort data=wide;
  by name;
run;

proc transpose data = wide
               out = long2 (rename = (col1 = the_length 
                                      _name_ = lanetype));
  by name;
  var 'BIKE BOULEVARD'n -- NA;
run;

data long2;
   set long2(rename = (the_length = length));
   if length = 'NA' then the_length = .;
   else the_length = input(length, 20.7);
   drop length;
run;

title 'Using PROC TRANSPOSE';
proc print data = long2(obs=10);
run;

title;
SAS 出力

Using a DATA step

OBS name lanetype the_length
1 ALBEMARLE ST BIKE BOULEVARD .
2 ALBEMARLE ST BIKE LANE .
3 ALBEMARLE ST CONTRAFLOW .
4 ALBEMARLE ST SHARED BUS BIKE .
5 ALBEMARLE ST SHARROW 109.914
6 ALBEMARLE ST SIDEPATH .
7 ALBEMARLE ST SIGNED ROUTE 234.919
8 ALBEMARLE ST NA .
9 ALICEANNA ST BIKE BOULEVARD .
10 ALICEANNA ST BIKE LANE .

Using PROC TRANSPOSE

OBS name lanetype the_length
1 ALBEMARLE ST BIKE BOULEVARD .
2 ALBEMARLE ST BIKE LANE .
3 ALBEMARLE ST CONTRAFLOW .
4 ALBEMARLE ST SHARED BUS BIKE .
5 ALBEMARLE ST SHARROW 109.914
6 ALBEMARLE ST SIDEPATH .
7 ALBEMARLE ST SIGNED ROUTE 234.919
8 ALBEMARLE ST NA .
9 ALICEANNA ST BIKE BOULEVARD .
10 ALICEANNA ST BIKE LANE .
  1. roads.csvとcrashes.csvファイルをデータセットroadcrashとして読み込みんでください。

proc import datafile="/folders/myfolders/SAS_Notes/data/roads.csv"
            out = road dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

proc import datafile="/folders/myfolders/SAS_Notes/data/crashes.csv"
            out = crash dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

proc print data = road;
run;

proc print data = crash(obs=10);
run;
SAS 出力
OBS Road District Length
1 Interstate 65 Greenfield 262
2 Interstate 70 Vincennes 156
3 US-36 Crawfordsville 139
4 US-40 Greenfield 150
5 US-52 Crawfordsville 172

OBS Year Road N_Crashes Volume
1 1991 Interstate 65 25 40000
2 1992 Interstate 65 37 41000
3 1993 Interstate 65 45 45000
4 1994 Interstate 65 46 45600
5 1995 Interstate 65 46 49000
6 1996 Interstate 65 59 51000
7 1997 Interstate 65 76 52000
8 1998 Interstate 65 90 58000
9 1999 Interstate 65 95 65000
10 2000 Interstate 65 95 74000
  1. データセットcrashの変数「Road」にあるハイフン(-)をすべて空白に置き換え(tranwrdを使用)、データセットcrash2とします。変数「Road」をPROC FREQにより度数表を作成してください。

data crash2;
  set crash;
  road = tranwrd(road, '-', ' ');
run;

proc freq data = crash2;
  table road;
run;
SAS 出力

FREQ プロシジャ

Road 度数 パーセント 累積
度数
累積
パーセント
Interstate 275 22 20.00 22 20.00
Interstate 65 22 20.00 44 40.00
Interstate 70 22 20.00 66 60.00
US 36 22 20.00 88 80.00
US 40 22 20.00 110 100.00
  1. データセットcrashroadのそれぞれに何件のオブザベーションがありますか?

proc contents data = crash;
run;

proc contents data = road;
run;
SAS 出力

CONTENTS プロシジャ

データセット名 WORK.CRASH オブザベーション数 110
メンバータイプ DATA 変数の数 4
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:58:44 オブザベーションのバッファ長 40
更新日時 2024/06/06 09:58:44 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 1
データページの先頭 1
ページごとの最大OBS数 3265
先頭ページのOBS数 110
データセットの修復数 0
ファイル名 /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/crash.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 2063333
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 256KB
ファイルサイズ (バイト) 262144
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ 出力形式 入力形式
3 N_Crashes 数値 8 BEST12. BEST32.
2 Road 文字 14 $14. $14.
4 Volume 数値 8 BEST12. BEST32.
1 Year 数値 8 BEST12. BEST32.

CONTENTS プロシジャ

データセット名 WORK.ROAD オブザベーション数 5
メンバータイプ DATA 変数の数 3
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:58:44 オブザベーションのバッファ長 40
更新日時 2024/06/06 09:58:44 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 1
データページの先頭 1
ページごとの最大OBS数 3265
先頭ページのOBS数 5
データセットの修復数 0
ファイル名 /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/road.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 2063331
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 256KB
ファイルサイズ (バイト) 262144
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ 出力形式 入力形式
2 District 文字 14 $14. $14.
3 Length 数値 8 BEST12. BEST32.
1 Road 文字 13 $13. $13.

crash: 110オブザベーション、road: 5オブザベーション

  1. crash2の「Road」scanを使って(「type」と「number」)に分割します。この結果を再びcrash2に割り当てます。crash2の「type」をPROC FREQで度数表を作成してください。次に、連結関数(CATなど)を使って新しい変数「road_hyphen」を作成します。「type」と「number」の列をハイフン(-)で結合し、「road_hyphen」をPROC FREQで度数表を作成してください。

data crash2;
  set crash2;
  type = scan(road, 1);
  number = scan(road, 2);
run;

proc freq data=crash2;
  table type;
run;

data crash2;
  set crash2;
  road_hyphen = catx('-', type, number);
run;

proc freq data=crash2;
  table road_hyphen;
run;
SAS 出力

FREQ プロシジャ

type 度数 パーセント 累積
度数
累積
パーセント
Interstate 66 60.00 66 60.00
US 44 40.00 110 100.00

FREQ プロシジャ

road_hyphen 度数 パーセント 累積
度数
累積
パーセント
Interstate-275 22 20.00 22 20.00
Interstate-65 22 20.00 44 40.00
Interstate-70 22 20.00 66 60.00
US-36 22 20.00 88 80.00
US-40 22 20.00 110 100.00
  1. crashデータセットでは、どの年のデータが収集されましたか?何年分ありますか?

proc freq data=crash;
  table year;
run;
SAS 出力

FREQ プロシジャ

Year 度数 パーセント 累積
度数
累積
パーセント
1991 5 4.55 5 4.55
1992 5 4.55 10 9.09
1993 5 4.55 15 13.64
1994 5 4.55 20 18.18
1995 5 4.55 25 22.73
1996 5 4.55 30 27.27
1997 5 4.55 35 31.82
1998 5 4.55 40 36.36
1999 5 4.55 45 40.91
2000 5 4.55 50 45.45
2001 5 4.55 55 50.00
2002 5 4.55 60 54.55
2003 5 4.55 65 59.09
2004 5 4.55 70 63.64
2005 5 4.55 75 68.18
2006 5 4.55 80 72.73
2007 5 4.55 85 77.27
2008 5 4.55 90 81.82
2009 5 4.55 95 86.36
2010 5 4.55 100 90.91
2011 5 4.55 105 95.45
2012 5 4.55 110 100.00

データセットcrashに含まれているのは1991-2012の22年分

  1. Bike_Lanes.csvをデータセットbikeとして読み込んでください。

proc import datafile="/folders/myfolders/SAS_Notes/data/Bike_Lanes.csv"
            out = bike dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

proc print data=bike(obs=5);
run;
SAS 出力
OBS subType name block type numLanes project route length dateInstalled
1       BIKE BOULEVARD 1 GUILFORD AVE BIKE BLVD   435.73787702 0
2       SIDEPATH 1   NORTHERN 1024.6746249 2010
3       SIGNED ROUTE 1 SOUTHEAST BIKE NETWORK   3749.3226377 2010
4   HUNTINGDON PATH   SIDEPATH 1     0 0
5 STCLN EDMONDSON AVE 5300 BLK EDMONDSON AVE BIKE LANE 1 OPERATION ORANGE CONE   180.92546489 2011
  1. 「type」と「name」に欠損値がない行のみを残し、出力をbikeに再度割り当ててください。

data bike;
  set bike;
  where not missing(type);
run;

proc print data=bike(obs=5);
run;
SAS 出力
OBS subType name block type numLanes project route length dateInstalled
1       BIKE BOULEVARD 1 GUILFORD AVE BIKE BLVD   435.73787702 0
2       SIDEPATH 1   NORTHERN 1024.6746249 2010
3       SIGNED ROUTE 1 SOUTHEAST BIKE NETWORK   3749.3226377 2010
4   HUNTINGDON PATH   SIDEPATH 1     0 0
5 STCLN EDMONDSON AVE 5300 BLK EDMONDSON AVE BIKE LANE 1 OPERATION ORANGE CONE   180.92546489 2011
  1. PROC MEANSでBYステートメントを使い、「name」と「type」でグループ化(各nameごとのtypeごとの意味)し、「length」の合計を求めてください。OUTPUTステートメントを使ってこの要約データセットを出力し、「name」、「type」と合計した「length」(これをlengthに名前を変更)のみを保持し、データセットsubとしてください。

proc sort data = bike;
  by name type;
run;

proc means data = bike noprint;
  by name type;
  output out=sub sum=length;
run;

data sub;
  set sub;
  keep name type length;
run;

proc print data=sub(obs=8);
run;
SAS 出力
OBS name type length
1   BIKE BOULEVARD 1
2   BIKE LANE 1
3   SHARROW 3
4   SIDEPATH 1
5   SIGNED ROUTE 8
6 ALBEMARLE ST SHARROW 8
7 ALBEMARLE ST SIGNED ROUTE 8
8 ALICEANNA ST SHARROW 38
proc freq data=sub;
  table type;
run;
SAS 出力

FREQ プロシジャ

type 度数 パーセント 累積
度数
累積
パーセント
BIKE BOULEVARD 3 1.80 3 1.80
BIKE LANE 54 32.34 57 34.13
CONTRAFLOW 4 2.40 61 36.53
SHARED BUS BIKE 4 2.40 65 38.92
SHARROW 50 29.94 115 68.86
SIDEPATH 5 2.99 120 71.86
SIGNED ROUTE 47 28.14 167 100.00
  1. subを縦持ちの形式から「type」を変数名、「length」を値とした横持ちの形式に変換してください。(注: 「name」にはスペースが含まれます。変数名にする前にスペースを置き換える必要はあるでしょうか? データステップによる方法はすべての「name」が同じ「type」の値を持っていないことから、難しくなっています。)

data new_wide;
  set sub;
  by name;
  retain BIKE_BOULEVARD BIKE_LANE CONTRAFLOW SHARED_BUS_BIKE 
         SHARROW SIDEPATH SIGNED_ROUTE;
  array atype [*] BIKE_BOULEVARD BIKE_LANE CONTRAFLOW SHARED_BUS_BIKE 
                  SHARROW SIDEPATH SIGNED_ROUTE;
                  
  if first.name then call missing(of atype(*));
  
  if type = 'BIKE BOULEVARD' then atype[1] = length;
  else if type = 'BIKE LANE' then atype[2] = length;
  else if type = 'CONTRAFLOW' then atype[3] = length;
  else if type = 'SHARED BUS BIKE' then atype[4] = length;
  else if type = 'SHARROW' then atype[5] = length;
  else if type = 'SIDEPATH' then atype[6] = length;
  else if type = 'SIGNED ROUTE' then atype[7] = length;
  
  if last.name then output;
  drop type length;
run;

title 'Wide Dataset Using DATA Step';
proc print data=new_wide(obs=5);   
run;

proc transpose data = sub out = new_wide2(drop=_name_);
  by name;
  var length;
  id type;
run;

title 'Wide Dataset Using PROC TRANSPOSE';
proc print data = new_wide2(obs=5);   
run;

title ;
SAS 出力

Wide Dataset Using DATA Step

OBS name BIKE_BOULEVARD BIKE_LANE CONTRAFLOW SHARED_BUS_BIKE SHARROW SIDEPATH SIGNED_ROUTE
1   1 1 . . 3 1 8
2 ALBEMARLE ST . . . . 8 . 8
3 ALICEANNA ST . . . . 38 . .
4 ARGONNE DR . 2 . . . . .
5 ART MUSEUM DR . . . . . . 6

Wide Dataset Using PROC TRANSPOSE

OBS name BIKE BOULEVARD BIKE LANE SHARROW SIDEPATH SIGNED ROUTE CONTRAFLOW SHARED BUS BIKE
1   1 1 3 1 8 . .
2 ALBEMARLE ST . . 8 . 8 . .
3 ALICEANNA ST . . 38 . . . .
4 ARGONNE DR . 2 . . . . .
5 ART MUSEUM DR . . . . 6 . .
  1. データセットcrashroadを「Road」をキーとして結合し完全ケースだけを含むようにして(内部結合を使用)、名前をmergedとしてください。いくつのオブザベーションが含まれますか?

proc sort data = road;
  by road;
run;

proc sort data = crash;
  by road;
run;

data merged;
  merge road (in = in1) 
        crash (in = in2);
  by road;
  if in1 = 1 and in2 = 1;
run;

proc contents data = merged;
run;
SAS 出力

CONTENTS プロシジャ

データセット名 WORK.MERGED オブザベーション数 88
メンバータイプ DATA 変数の数 6
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:59:05 オブザベーションのバッファ長 64
更新日時 2024/06/06 09:59:05 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 1
データページの先頭 1
ページごとの最大OBS数 2043
先頭ページのOBS数 88
データセットの修復数 0
ファイル名 /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/merged.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 2063333
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 256KB
ファイルサイズ (バイト) 262144
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ 出力形式 入力形式
2 District 文字 14 $14. $14.
3 Length 数値 8 BEST12. BEST32.
5 N_Crashes 数値 8 BEST12. BEST32.
1 Road 文字 13 $13. $13.
6 Volume 数値 8 BEST12. BEST32.
4 Year 数値 8 BEST12. BEST32.

88オブザベーション

  1. 外部結合により結合して、名前はfull_joinとしてください。 いくつのオブザベーションが含まれますか?

data full_join;
  merge road crash;
  by road;
run;

proc print data = full_join(obs=10);
run;
SAS 出力
OBS Road District Length Year N_Crashes Volume
1 Interstate 27   . 1991 27 20350
2 Interstate 27   . 1992 26 21200
3 Interstate 27   . 1993 22 23200
4 Interstate 27   . 1994 21 21200
5 Interstate 27   . 1995 28 23200
6 Interstate 27   . 1996 22 20000
7 Interstate 27   . 1997 27 18000
8 Interstate 27   . 1998 21 19500
9 Interstate 27   . 1999 22 21000
10 Interstate 27   . 2000 29 20700

115 オブザベーション

  1. roadcrashを左結合により結合してください。ここでは順番が重要になります。いくつのオブザベーションが含まれますか?

data left_join;
  merge road (in = in1) crash;
  by road;
  if in1 = 1;
run;

proc contents data = left_join;
run;
SAS 出力

CONTENTS プロシジャ

データセット名 WORK.LEFT_JOIN オブザベーション数 89
メンバータイプ DATA 変数の数 6
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:59:13 オブザベーションのバッファ長 64
更新日時 2024/06/06 09:59:13 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 1
データページの先頭 1
ページごとの最大OBS数 2043
先頭ページのOBS数 89
データセットの修復数 0
ファイル名 /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/left_join.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 2063332
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 256KB
ファイルサイズ (バイト) 262144
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ 出力形式 入力形式
2 District 文字 14 $14. $14.
3 Length 数値 8 BEST12. BEST32.
5 N_Crashes 数値 8 BEST12. BEST32.
1 Road 文字 13 $13. $13.
6 Volume 数値 8 BEST12. BEST32.
4 Year 数値 8 BEST12. BEST32.

89オブザベーション

  1. 上記を右結合により結合してください。いくつのオブザベーションが含まれますか?

data right_join;
  merge road crash (in = in1);
  by road;
  if in1 = 1;
run;

proc contents data = right_join;
run;
SAS 出力

CONTENTS プロシジャ

データセット名 WORK.RIGHT_JOIN オブザベーション数 110
メンバータイプ DATA 変数の数 6
エンジン V9 インデックス数 0
作成日時 2024/06/06 09:59:55 オブザベーションのバッファ長 64
更新日時 2024/06/06 09:59:55 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64    
エンコード utf-8 Unicode (UTF-8)    
エンジン/ホスト関連情報
データセットのページサイズ 131072
データセットのページ数 1
データページの先頭 1
ページごとの最大OBS数 2043
先頭ページのOBS数 110
データセットの修復数 0
ファイル名 /saswork/SAS_work6DBC000162BD_odaws01-apse1.oda.sas.com/SAS_work5719000162BD_odaws01-apse1.oda.sas.com/right_join.sas7bdat
作成したリリース 9.0401M7
作成したホスト Linux
I ノード番号 2063337
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 256KB
ファイルサイズ (バイト) 262144
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ 出力形式 入力形式
2 District 文字 14 $14. $14.
3 Length 数値 8 BEST12. BEST32.
5 N_Crashes 数値 8 BEST12. BEST32.
1 Road 文字 13 $13. $13.
6 Volume 数値 8 BEST12. BEST32.
4 Year 数値 8 BEST12. BEST32.

110オブザベーション

Output Delivery System(ODS)とグラフ#

proc import datafile = "/folders/myfolders/SAS_Notes/data/Charm_City_Circulator_Ridership.csv"
            out = circ dbms = csv replace;
  getnames = yes;
  guessingrows = max;
run;

data long;
  set circ;
  array larray[*] orangeBoardings -- bannerAverage;
  do i = 1 to dim(larray);
    var = vname(larray[i]);
    number = larray[i];
    var = tranwrd(var, 'Board', ' Board');
    var = tranwrd(var, 'Alight', ' Alight');
    var = tranwrd(var, 'Average', ' Average');
    route = scan(var, 1);
    type = scan(var, 2);
    output;
  end;
   
  drop i var orangeBoardings -- bannerAverage;
run;

data avg;
  set long;
  where type = 'Average' and number ^= .;
run;

proc print data = long(obs = 10);
run;

proc print data = avg(obs=10);
run;
SAS 出力

SAS システム

OBS day date daily number route type
1 Monday 01/11/2010 952 877 orange Boardings
2 Monday 01/11/2010 952 1027 orange Alightings
3 Monday 01/11/2010 952 952 orange Average
4 Monday 01/11/2010 952 . purple Boardings
5 Monday 01/11/2010 952 . purple Alightings
6 Monday 01/11/2010 952 . purple Average
7 Monday 01/11/2010 952 . green Boardings
8 Monday 01/11/2010 952 . green Alightings
9 Monday 01/11/2010 952 . green Average
10 Monday 01/11/2010 952 . banner Boardings

SAS システム

OBS day date daily number route type
1 Monday 01/11/2010 952 952.0 orange Average
2 Tuesday 01/12/2010 796 796.0 orange Average
3 Wednesday 01/13/2010 1211.5 1211.5 orange Average
4 Thursday 01/14/2010 1213.5 1213.5 orange Average
5 Friday 01/15/2010 1644 1644.0 orange Average
6 Saturday 01/16/2010 1490.5 1490.5 orange Average
7 Sunday 01/17/2010 888.5 888.5 orange Average
8 Monday 01/18/2010 999.5 999.5 orange Average
9 Tuesday 01/19/2010 1035 1035.0 orange Average
10 Wednesday 01/20/2010 1395.5 1395.5 orange Average
  1. データセットavgから日付ごとの平均乗客数の散布図を作成してください。 a. ポイントの色をルート(オレンジ、パープル、グリーン、バナー)で色分けしてください。ここではデフォルトの色で構いません。 b. 各ルートに対して黒い滑らかな曲線(LOESS)を追加してください。 c. ポイントの色を曜日ごとにしてください。

title '1a';
proc sgplot data = avg; 
  scatter y = number x = date / group = route;
run;

title '1b';
proc sgplot data = avg;   
  scatter y = number x = date / group = route;
  loess y = number x = date / group = route lineattrs=(color = black);
run;

title '1c';
proc sgplot data = avg;   
  scatter y = number x = date / group = day;
run;
SAS 出力
SGPlot プロシジャ

SGPlot プロシジャ

SGPlot プロシジャ
  1. ポイントの色がルートの名前(バナー→青)である1aを再プロットしてください。注:属性マッピングデータを作成する必要があります。

data marker_map;
  input id $2. +1 VALUE $6. +1 MARKERCOLOR $6.;
  datalines;
mc banner blue
mc green  green
mc orange orange
mc purple purple
;
run;

title '2';
proc sgplot data = avg dattrmap = marker_map;   
  scatter y = number x = date / group = route attrid = mc;
run;
SAS 出力
SGPlot プロシジャ
  1. ルートごとにパネルを1つずつ持つ、日付ごとの平均乗客数の散布図を作成してください。

title '3';
proc sgpanel data = avg;   
  panelby route;
  scatter y = number x = date;
run;
SAS 出力
SGPanel プロシジャ
  1. 曜日ごとに別々のパネルを持ち、ルートで色分けされた、日付ごとの平均乗客数の散布図を作成してください。

*Default colors are fine here to, but we can also use a data attribute map like we did before;
title '4';
proc sgpanel data = avg dattrmap = marker_map;   
  panelby day;
  scatter y = number x = date / group = route attrid = mc;
run;
SAS 出力
SGPanel プロシジャ
SGPanel プロシジャ
SGPanel プロシジャ
SGPanel プロシジャ
  1. ルートで色分けされた(1aと同じ)、日付ごとの平均乗客数(avg)の散布図を作成してください。(平均を算出はせず、各ルートの平均の列を使用します)。x軸のラベルを”Year”、y軸のラベルを”Number of People”にします。

title '5';
proc sgplot data = avg dattrmap = marker_map;   
  scatter y = number x = date / group = route attrid = mc;
  xaxis label = "Year";
  yaxis label = "Number of People";
run;
SAS Output
The SGPlot Procedure
  1. オレンジルートの日付に対する平均乗客数の線グラフを作成し、乗車数(boardings)と降車数(alightings)も誤差線として破線にして追加してください。線の色はオレンジにします。

data orange;
  set long;
  where route = "orange";
run;

data line_map;
  input id $2. +1 VALUE $10. +1 linepattern $5.;
  datalines;
lp Alightings dash
lp Average    solid
lp Boardings  dash
;
run;

title '6';
proc sgplot data = orange dattrmap = line_map;  
  series y = number x = date / group = type attrid = lp lineattrs=(color = orange);
run;

title;
SAS 出力
SGPlot プロシジャ

SASによる統計解析#

filename cardata '/folders/myfolders/SAS_Notes/data/kaggleCarAuction.csv';

proc import datafile = cardata out = cars dbms = csv replace;
  getnames = yes;
  guessingrows = 1000;
run;

filename mortdat '/folders/myfolders/SAS_Notes/data/indicatordeadkids35.csv';

proc import datafile = mortdat out = mort dbms = csv replace;
  getnames = yes;
  guessingrows = 500;
run;
  1. 1980年、1990年、2000年、2010年の死亡率データ間の相関関係を計算します。結果を画面に表示するだけで十分です。次に、NOMMISS オプションを使用して計算します。(注意: 列名は数値ですが、SASの標準的な名前としては無効なので、コード内で 1980 年の変数を指すには ‘1980’n を使用します)

proc corr data = mort;
  var '1980'n '1990'n '2000'n '2010'n;
run;

proc corr data = mort nomiss;
  var '1980'n '1990'n '2000'n '2010'n;
run;
SAS 出力

SAS システム

CORR プロシジャ

4 変数 : 1980 1990 2000 2010
単純統計量
変数 N 平均 標準偏差 合計 最小値 最大値
1980 197 0.94731 0.88694 186.62013 0.07049 3.49035
1990 197 0.70911 0.77929 139.69428 0.04922 3.28983
2000 197 0.55004 0.68922 108.35786 0.03232 2.81186
2010 193 0.39601 0.50021 76.42946 0.03173 2.02857
Pearson の相関係数
H0: Rho=0 に対する Prob > |r|
オブザベーション数
  1980 1990 2000 2010
1980
1.00000
 
197
0.96015
<.0001
197
0.88884
<.0001
197
0.84683
<.0001
193
1990
0.96015
<.0001
197
1.00000
 
197
0.96138
<.0001
197
0.92472
<.0001
193
2000
0.88884
<.0001
197
0.96138
<.0001
197
1.00000
 
197
0.98623
<.0001
193
2010
0.84683
<.0001
193
0.92472
<.0001
193
0.98623
<.0001
193
1.00000
 
193

SAS システム

CORR プロシジャ

4 変数 : 1980 1990 2000 2010
単純統計量
変数 N 平均 標準偏差 合計 最小値 最大値
1980 193 0.96250 0.88966 185.76175 0.07049 3.49035
1990 193 0.72132 0.78263 139.21550 0.05512 3.28983
2000 193 0.55976 0.69297 108.03459 0.03271 2.81186
2010 193 0.39601 0.50021 76.42946 0.03173 2.02857
Pearson の相関係数, N = 193
H0: Rho=0 に対する Prob > |r|
  1980 1990 2000 2010
1980
1.00000
 
0.95968
<.0001
0.88774
<.0001
0.84683
<.0001
1990
0.95968
<.0001
1.00000
 
0.96103
<.0001
0.92472
<.0001
2000
0.88774
<.0001
0.96103
<.0001
1.00000
 
0.98623
<.0001
2010
0.84683
<.0001
0.92472
<.0001
0.98623
<.0001
1.00000
 

a. ミャンマー、中国、およびアメリカの死亡率データ間の相関関係を計算します。この相関行列をODS OUTPUT を使用してデータセット country_corに出力します。    b. ミャンマーとアメリカの相関関係を相関行列から抽出します。

data mort_sub;
  set mort(rename=(Var1 = Country));
  where country in ('Myanmar' 'China' 'United States');
run;

proc transpose data = mort_sub out = mort_sub_transposed;
  var '1760'n -- '2099'n;
  id country;
run;

ods output PearsonCorr = country_cor;
proc corr data = mort_sub_transposed;
  var China Myanmar 'United States'n;   
run;

proc print data = country_cor;
  var Myanmar;
  where Variable = 'United States';
run;
SAS 出力

SAS システム

CORR プロシジャ

3 変数 : China Myanmar United States
単純統計量
変数 N 平均 標準偏差 合計 最小値 最大値
China 214 2.37608 1.15555 508.48153 0.04325 3.61453
Myanmar 214 2.82215 1.12767 603.94031 0.05150 3.76418
United States 214 1.36080 1.14407 291.21132 0.02867 3.17018
Pearson の相関係数, N = 214
H0: Rho=0 に対する Prob > |r|
  China Myanmar United States
China
1.00000
 
0.97436
<.0001
0.69093
<.0001
Myanmar
0.97436
<.0001
1.00000
 
0.62926
<.0001
United States
0.69093
<.0001
0.62926
<.0001
1.00000
 

SAS システム

OBS Myanmar
3 0.62926
  1. 1990年と2000年の死亡率情報間に差があるかどうかを、対応のある t 検定とウィルコクソン符号順位検定で調べてください。ヒント: 1990年の情報列を取り出すには ‘1990’n を使用します。

proc ttest data = mort;
  paired '1990'n*'2000'n;
run;

data diff;
  set mort;
  diff = '2000'n - '1990'n;
run;

proc univariate data = diff;
  var diff;
run;
SAS 出力

SAS システム

TTEST プロシジャ

 

差 : 1990 - 2000

N 平均 標準偏差 標準誤差 最小値 最大値
197 0.1591 0.2227 0.0159 -0.5456 0.8726
平均 平均の
95% 信頼限界
標準偏差 標準偏差の
95% 信頼限界
0.1591 0.1278 0.1904 0.2227 0.2027 0.2472
自由度 t 値 Pr > |t|
196 10.03 <.0001
1990 と 2000 の差の要約パネル
1990 と 2000 のプロファイルプロット
1990 と 2000 の一致度プロット
1990 と 2000 の差の QQ プロット

SAS システム

UNIVARIATE プロシジャ

変数 : diff

モーメント
N 197 重み変数の合計 197
平均 -0.1590681 合計 -31.336415
標準偏差 0.22269839 分散 0.04959457
歪度 -0.9205453 尖度 2.01791651
無修正平方和 14.7051599 修正済平方和 9.72053615
変動係数 -140.00192 平均の標準誤差 0.0158666
基本統計量
位置 ばらつき
平均 -0.15907 標準偏差 0.22270
中央値 -0.09007 分散 0.04959
最頻値 . 範囲 1.41823
    四分位範囲 0.21805
 位置の検定 H0: Mu0=0
検定 統計量 p 値
Student の t 検定 t -10.0253 Pr > |t| <.0001
符号検定 M -84.5 Pr >= |M| <.0001
符号付順位検定 S -8245.5 Pr >= |S| <.0001
 分位点 (定義 5)
水準 分位点
100% 最大値 0.5456100
99% 0.3990751
95% 0.0830986
90% -0.0104786
75% Q3 -0.0286619
50% 中央値 -0.0900725
25% Q1 -0.2467130
10% -0.4798594
5% -0.6188205
1% -0.8710244
0% 最小値 -0.8726242
極値
最小値 最大値
Obs Obs
-0.872624 19 0.272621 32
-0.871024 131 0.321500 196
-0.808735 96 0.329956 22
-0.804626 54 0.399075 99
-0.794268 106 0.545610 197
  1. データセット carsを使用して、車両価格「VehBCost」 を従属変数とし、車両年齢「VehicleAge」とオンライン販売 「IsOnlineSale」の有無とその相互作用を予測変数とする線形回帰モデルを使用します。

proc glm data = cars;
  model VehBCost = VehicleAge IsOnlineSale VehicleAge*IsOnlineSale;
run;
SAS 出力

SAS システム

GLM プロシジャ

読み込んだオブザベーション数 72983
使用されたオブザベーション数 72983

SAS システム

GLM プロシジャ

 

従属変数 : VehBCost

要因 自由度 平方和 平均平方 F 値 Pr > F
Model 3 22422071293 7474023764.4 2652.08 <.0001
Error 72979 205667188003 2818169.4461    
Corrected Total 72982 228089259296      
R2 乗 変動係数 Root MSE VehBCost の平均
0.098304 24.94067 1678.740 6730.934
要因 自由度 Type I
平方和
平均平方 F 値 Pr > F
VehicleAge 1 22249980049 22249980049 7895.19 <.0001
IsOnlineSale 1 158865621 158865621 56.37 <.0001
VehicleAg*IsOnlineSa 1 13225623 13225623 4.69 0.0303
要因 自由度 Type III
平方和
平均平方 F 値 Pr > F
VehicleAge 1 21533779839 21533779839 7641.05 <.0001
IsOnlineSale 1 64252535 64252535 22.80 <.0001
VehicleAg*IsOnlineSa 1 13225623 13225623 4.69 0.0303
パラメータ 推定値 標準誤差 t 値 Pr > |t|
Intercept 8062.701999 16.5870226 486.08 <.0001
VehicleAge -320.662108 3.6683525 -87.41 <.0001
IsOnlineSale 514.308268 107.7114631 4.77 <.0001
VehicleAg*IsOnlineSa -55.372926 25.5607123 -2.17 0.0303
  1. データセットcars内に車両価格が 10,000 ドルを超えていることを示す変数「expensive」を作成してください。カイ二乗検定により車が高価だったことと、損な取引だったことを示すラベル用変数「IsBadbuy」に関連があるかを評価してください。

data cars;
  set cars;
  if VehBCost > 10000 then expensive = 1;
  else expensive = 0;
run;

proc freq data = cars;
  tables expensive*IsBadBuy / chisq;
run;
SAS 出力

SAS システム

FREQ プロシジャ

度数
パーセント
行のパーセント
列のパーセント
表 : expensive * IsBadBuy
expensive IsBadBuy
0 1 合計
0
61505
84.27
87.67
96.09
8652
11.85
12.33
96.39
70157
96.13
 
 
1
2502
3.43
88.54
3.91
324
0.44
11.46
3.61
2826
3.87
 
 
合計
64007
87.70
8976
12.30
72983
100.00

expensive * IsBadBuy の統計量

統計量 自由度 p 値
カイ 2 乗値 1 1.8948 0.1687
尤度比カイ 2 乗値 1 1.9314 0.1646
連続性補正カイ 2 乗値 1 1.8152 0.1779
Mantel-Haenszel のカイ 2 乗値 1 1.8948 0.1687
ファイ係数   -0.0051  
一致係数   0.0051  
Cramer の V 統計量   -0.0051  
Fisher の正確検定
セル (1,1) 度数 (F) 61505
左側 Pr <= F 0.0880
右側 Pr >= F 0.9211
   
表の確率 (P) 0.0091
両側 Pr <= P 0.1790

標本サイズ = 72983

  1. ロジスティック回帰を使用し、 応答変数を「IsBadbuy」予測変数を「expensive」「VehicleAge」としてオッズ比の信頼区間を算出してください。

proc logistic data = cars;
  model IsBadBuy(event='1') = expensive VehicleAge / clodds = wald;
run;
SAS 出力

SAS システム

LOGISTIC プロシジャ

モデルの情報
データセット WORK.CARS
応答変数 IsBadBuy
応答の水準数 2
モデル binary logit
最適化の手法 Fisher's scoring
読み込んだオブザベーション数 72983
使用されたオブザベーション数 72983
反応プロファイル
順番 IsBadBuy 度数の合計
1 0 64007
2 1 8976

モデルの確率基準は IsBadBuy='1' です。

モデル収束状態
収束基準(GCONV=1E-8)は満たされました。
モデルの適合度統計量
基準 切片のみ 切片と共変量
AIC 54423.307 52447.788
SC 54432.505 52475.381
-2 Log L 54421.307 52441.788
包括的帰無仮説: BETA=0 の検定
検定 カイ 2 乗値 自由度 Pr > ChiSq
尤度比 1979.5198 2 <.0001
スコア 2042.5760 2 <.0001
Wald 1961.8662 2 <.0001
最尤推定値の分析
パラメータ 自由度 推定値 標準誤差 Wald
カイ 2 乗値
Pr > ChiSq
Intercept 1 -3.2495 0.0332 9554.1782 <.0001
expensive 1 -0.0804 0.0607 1.7542 0.1853
VehicleAge 1 0.2866 0.00648 1958.7086 <.0001
予測確率と観測データの応答との関連性
一致の割合 56.9 Somers の D 0.279
不一致の割合 29.1 ガンマ 0.324
タイの割合 14.0 Tau-a 0.060
574526832 c 0.639
オッズ比推定と Wald による信頼区間
効果 単位 推定値 95% 信頼限界
expensive 1.0000 0.923 0.819 1.039
VehicleAge 1.0000 1.332 1.315 1.349
プロット : オッズ比の 95% Wald 信頼限界

SAS MACRO プログラミング#

  1. 量的変数の値を以下のように4つのカテゴリーに分割するマクロを書いてください。:

    • X < Q1の場合、group = 1

    • Q1 < X < Medianの場合、group = 2

    • Median < X < Q3の場合、group = 3

    • Q3 < Xの場合、group = 4

このマクロの定義は次のようになります。%quartilesmacro(mydata, qvar, round, out);

  • mydata: 量的変数を含むデータセット

  • qvar: 量的変数の名前

  • round: 小数点以下の桁数

  • out: 出力データセット名。この中にカテゴリ化された変数「qvar_cat」が含まれます。例えば、「qvar」が”bmi”の場合、出力変数は「bmi_cat」になります。

例としてデータセットFraminghamを使用してマクロを検証します。

libname phc6089 "/folders/myfolders/SAS_Notes/data/";

*Create a temporary data set, so that we don't save changes to the original data set.;
data fghmtemp;
  set phc6089.fghm113;
run;

/*Now let's code some variables with some more descriptive values.
  SEX (Gender): 1=Men 
				2=Women
  Period (Examination cycle): 1=Period1 
							  2=Period2
							  3=Period3
  BPMEDS (Use of anti-hypertensive meds): 0=Not currently
										  1=Currently use
  CURSMOKE (Currently smoke?): 0=No
							   1=Yes
  DIABETES: 0=Not diabetic
			1=Diabetic
  PREVAP (Have angina pectoric?): 0=No
								  1=Yes
  PREVCHD (Coronary heart disease?): 0=No
									 1=Yes
  PREVMI (Myocardial infarction?): 0=No
								   1=Yes
  PREVSTRK (Had a stroke?): 0=No
				   			1=Yes
  PREVHYP (Hypertensive? sys bp >=140 or dyas bp >= 90): 0=no
														 1=yes
*/

proc format;
  value YNfmt 0="No"
  			1="Yes";
  value perfmt 1="Period 1"
  			 2="Period 2"
  			 3="Period 3";
  value gndrfmt 1="Men"
  			  2="Women";
run;

data fghmtemp;
  set fghmtemp;
  format prevap ynfmt.
  	   diabetes ynfmt.
  	   cursmoke ynfmt.
  	   bpmeds ynfmt.
  	   prevchd ynfmt.
  	   prevmi ynfmt.
  	   prevstrk ynfmt.
  	   prevhyp ynfmt.
  	   sex gndrfmt.;
run;
* Step 1 - write code with only macros variables - Let's categorize BMI by quartiles;

%let qvar = bmi;

* Find table name;
ods trace on;
proc means data = fghmtemp Q1 Median Q3;
  var &qvar.;
run;
ods trace off;

ods output summary = quartiles;
proc means data = fghmtemp Q1 Median Q3;
  var &qvar.;
run;

* See the contents of the ODS table;
proc print data = quartiles;
run;

data _null_;
  set quartiles;
  call symputx("Q1", strip(&qvar._Q1));
  call symputx("M", strip(&qvar._Median));
  call symputx("Q3", strip(&qvar._Q3));
run;

%put _user_; * see the value of our macro variables in the log file;

data fghmtemp;
  set fghmtemp;
  if not missing(&qvar.) and &qvar. < &Q1. then &qvar._cat = 1;
  else if &qvar. < &M. then &qvar._cat = 2;
  else if &qvar. < &Q3. then &qvar._cat = 3;
  else &qvar._cat = 4;
run;

proc freq data = fghmtemp;
  tables &qvar._cat;
run;
SAS 出力

SAS システム

MEANS プロシジャ

分析変数 : BMI Body Mass Index (kr/(M*M)
下側四分位点 中央値 上側四分位点
23.1000000 25.2800000 27.6300000

SAS システム

MEANS プロシジャ

分析変数 : BMI Body Mass Index (kr/(M*M)
下側四分位点 中央値 上側四分位点
23.1000000 25.2800000 27.6300000

SAS システム

OBS BMI_Q1 BMI_Median BMI_Q3
1 23.1 25.28 27.63

SAS システム

FREQ プロシジャ

bmi_cat 度数 パーセント 累積
度数
累積
パーセント
1 120 24.00 120 24.00
2 130 26.00 250 50.00
3 125 25.00 375 75.00
4 125 25.00 500 100.00

基礎となるコードは動作しました。これをマクロにしましょう。

%macro quartilesmacro(mydata, qvar, round, out = out_dat);

ods select none;
ods output summary = quartiles;
proc means data = &mydata. Q1 Median Q3 maxdec = &round.;
  var &qvar.; 
run;
ods select all;

data _null_;
  set quartiles;
  call symputx("Q1", strip(&qvar._Q1));
  call symputx("M", strip(&qvar._Median));
  call symputx("Q3", strip(&qvar._Q3));
run;

data &out.;
  set &mydata.;
  if not missing(&qvar.) and &qvar. < &Q1. then &qvar._cat = 1;
  else if &qvar. < &M. then &qvar._cat = 2;
  else if &qvar. < &Q3. then &qvar._cat = 3;
  else &qvar._cat = 4;
run;

%mend;

%quartilesmacro(fghmtemp, bmi, round = 2, out = out_bmi);

proc freq data = out_bmi;
  tables bmi_cat;
run;
SAS 出力

SAS システム

FREQ プロシジャ

bmi_cat 度数 パーセント 累積
度数
累積
パーセント
1 120 24.00 120 24.00
2 130 26.00 250 50.00
3 125 25.00 375 75.00
4 125 25.00 500 100.00

SASによるシミュレーション#

  1. この例では、母比率の標本分布を扱います。
    a) n = 1、p = 0.3の二項分布からサイズ50の500個のサンプルを生成してください。これを行うために、この二項分布からのランダム変量で埋められた500行50列のデータセットを生成します。ヒント:配列とネストされたDOループを使用します。
    b) mean(of )を使用して、これら500行の各行の平均を計算し、この平均を新しい列として保存してください。
    c) part bで計算された500個の平均のヒストグラムをプロットし、part bで計算された500個の平均からの平均と標準偏差を計算するためにPROC MEANSを使用してください。これは、サンプルサイズが30のときに成功確率p = 0.3の母集団分布を持つ場合のp-hatの標本分布を表しています。

data sim;
  array data[*] x1-x50;
  do numsim = 1 to 500;
     do n = 1 to 50;
        data[n] = ranbin(1234, 1, 0.3);
     end;
     p_hat = mean(of x1-x50);
     output;
  end;
run;

proc sgplot data = sim;
  histogram p_hat;
run;

proc means data = sim mean std;
  var p_hat;
run;
SAS 出力
SGPlot プロシジャ

SAS システム

MEANS プロシジャ

分析変数 : p_hat
平均 標準偏差
0.2980400 0.0635376