0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SASテクニック 幾何平均/幾何標準偏差の計算

Last updated at Posted at 2020-07-19

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;
class2.PNG

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; 

結果

geo1.PNG

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?