SASによる幾何平均/幾何標準偏差の算出
幾何平均とは...
高校で相加・相乗平均の関係をやったと思うが、あれの相乗平均のほう
詳しい計算はwikiみましょか
https://ja.wikipedia.org/wiki/%E5%B9%BE%E4%BD%95%E5%B9%B3%E5%9D%87
対数変換→平均値/標準偏差を算出→指数変換
で、幾何平均や幾何標準偏差を求めることができる
SASのmeansプロシジャでそのままでは出ないようだったので、いろいろ試してみた
R版
https://qiita.com/saspy/items/3403943d85b427937be3
使用するデータ
SASHELP.CLASSのHEIGHTでためす(ついでに性別ごとの計算にしてみる)
data work.CLASS;
set sashelp.CLASS( keep = SEX HEIGHT );
if HEIGHT > 0 then LOGVAL = log( HEIGHT );
run;
proc Sort;
by SEX HEIGHT;
run;
ttestプロシジャによる方法
幾何平均、幾何CV(%化はしない)、幾何平均や幾何CVの信頼区間を算出する
※現実的ではないが、変数値がすべて同じ場合でも幾何平均の信頼区間が出てしまう
(log(幾何標準偏差)が0のため、計算できないはず)
classを使うと、2群の群間比も出せる
(class変数は2値、class変数 = "Ratio (1/2)"のレコードに群間比)
ods select none;
ods output ConfLimits = work.GEO_1( drop = UMP: );
proc Ttest data = work.CLASS dist = lognormal;
by SEX;
var HEIGHT;
run;
ods select all;
ods selectは指定しなくてもいいが、アウトプットにいろいろ出てきてうざいのでつけてる
SQLプロシジャで直接的に計算する方法
とりあえず幾何平均、幾何標準偏差、幾何CVを計算
信頼区間もめんどいが式を書けば出せるはず
自然対数ってexp(1)以外に表せた気もするがわからん
追記:constant関数で数学定数を指定できるようで、constant( "e" )でokかな
proc Sql;
create table work.GEO_2 as
select
SEX ,
exp( 1 ) ** ( mean( log( HEIGHT ) ) ) as GEOMEAN ,
exp( 1 ) ** ( std( log( HEIGHT ) ) ) as GEOSTD ,
100 * sqrt( exp( 1 ) ** var( log( HEIGHT ) ) - 1 ) as GEOCV
from work.CLASS
group by SEX
order by SEX;
quit;
meansプロシジャ&dataステップでがんばる方法
対数変換した値でもってるとか、
テストデータとかですべて同じ値のときはこっちがいいかも
proc means data = work.CLASS noprint nway;
class SEX;
var LOGVAL;
output out = work.MEANS_RESULT( drop = _: )
n = N mean = MEAN std = STD lclm = LCLM uclm = UCLM var = VAR;
run;
data work.GEO_3( keep = SEX N GEO: );
set work.MEANS_RESULT;
array STAT_VAR{*} MEAN STD LCLM UCLM;
array GEO_VAR{*} GEOMEAN GEOSTD GEOLCLM GEOUCLM;
do i = 1 to dim( STAT_VAR );
GEO_VAR{i} = exp( 1 ) ** STAT_VAR{i};
end;
GEOCV = 100 * sqrt( exp( 1 ) ** VAR - 1 );
run;
結果
geomeanって関数もあるようなので、
横に転置してgeomean関数使うのもあり
surveymeansプロシジャでも出せる
https://www.sas.com/offices/asiapacific/japan/service/technical/faq/list/body/stat058.html
https://documentation.sas.com/doc/ja/pgmsascdc/9.4_3.4/statug/statug_surveymeans_syntax01.htm