2022年9月1日木曜日

sasで幾何平均を出すときの注意事項

幾何平均は掛け算して根を計算するので値に0や負の数が含まれていると計算できないです.sasのプロシジャで求めるときに値に0が含まれていると,プロシジャによって結果が異なることを紹介します.

幾何平均を出すプロシジャのunivariate,surveymeans,ttestでそれぞれ幾何平均を求めます.使うのは0を含んだ3obsのデータです.私としては0を含むと幾何平均は0になるので,そもそも計算しないことが正しいと思いますが,sasだと0で出すか計算しないか0を除いて計算するかの3つなので,どのように数字を扱いたいかを事前に確認するのがよいと思います.
確認してないですが負の値が含まれていると欠損で値が返ってくるのですかね

/*使うデータ*/
data hoge ;
    a = 5 ; output ;    a = 0 ; output ;  a = 4 ; output ;
run;

/*  univariは0を含む幾何平均を0で出力する  */
proc univariate data=hoge noprint;
 var a;
 output out=out1 geomean=geomean;
run;

NOTE: データセットWORK.OUT1は1オブザベーション、1変数です。
NOTE: PROCEDURE UNIVARIATE処理(合計処理時間):
処理時間 0.00 秒
CPU時間 0.01 秒

data _null_ ;
    set out1 ;
    putlog geomean= ;
run ;

geomean=0
NOTE: データセットWORK.OUT1から1オブザベーションを読み込みました。
NOTE: DATAステートメント処理(合計処理時間):
処理時間 0.00 秒
CPU時間 0.00 秒

/*  surveymeansは0を含むと幾何平均を計算しない  */
proc surveymeans data=hoge geomean ;
  var a ;
  ods output GeometricMeans=out2;
run;

ERROR: A variable must be positive when geometric mean is requested.
NOTE: エラーが発生したため、このステップの処理を中止しました。
NOTE: PROCEDURE SURVEYMEANS処理(合計処理時間):
処理時間 0.00 秒
CPU時間 0.00 秒
WARNING: 出力'GeometricMeans'は作成されていません。出力オブジェクト名、ラベル、
パスが正しく記述されているかを確認してください。また、
要求した出力オブジェクトを作成するために、適切なプロシジャオプションが使われ
ているかも確認してください。たとえば、
NOPRINTオプションが使われていないことを確認してください。

/* ttestは0を含む幾何平均は,0を除いた値で計算してwarningを出す */
proc ttest data=hoge dist=lognormal;
  var a;
  ods output Statistics=out3;
run;

WARNING: 1 observations with invalid response values have been deleted. The response was less than or equal to zero for the
lognormal distribution.
NOTE: データセットWORK.OUT3は1オブザベーション、12変数です。
NOTE: PROCEDURE TTEST処理(合計処理時間):
処理時間 0.31 秒
CPU時間 0.17 秒
data _null_ ;
    set out3 ;
    putlog geommean= ;
run ;

GeomMean=4.4721
NOTE: データセットWORK.OUT3から1オブザベーションを読み込みました。
NOTE: DATAステートメント処理(合計処理時間):
処理時間 0.00 秒
CPU時間 0.00 秒

長々と書きましたが要はログを読んでくれ