たくさんある変数を一気に処理するために

プログラミング

このブログでは、統計解析ソフトStataのプログラミングのTipsや便利コマンドを紹介しています.

Facebook groupでは、ちょっとした疑問や気づいたことなどを共有して貰うフォーラムになっています. ブログと合わせて個人の学習に役立てて貰えれば幸いです.

さて、今回は、たくさんのバイオマーカーを網羅的に測定するような場面でデータをうまく加工するのにきっと役立つ方法です.

4-Methyl-2-oxopentanoate
4-Oxohexanoate
4-Acetylbutyrate
Heptanoate
N-Acetyl-beta-alanine
Glutarate
3-Ureidopropionate
2-Hydroxy-4-methylpentanoate

最近メタボローム解析にまで手を広げてしまったのですが、このようにたくさんの物質を網羅的に扱う場面が頻繁に現れるようになりました.

もう大抵のデータ加工には苦労しないのですが、代謝物の名前って数字で始まってたり、ハイフンが入っていたりとかなり手間取ります.

そのままデータをインポートしてもうまく変数名が付かない(数字で始まる変数名は数字部分が削られる)のです.

また、変数名をvar1, var2, var3,…などと名付けても、結果がどの物質のものなのかわからなくなってしまいます.

そこで、次のような変数とラベルの対応表を先に作成しておくことにしました.これをうまくラベルに反映させる方法をご紹介します.

variablelabel
anion1Glyoxylate
anion2Propionate
anion3Glycolate
anion4Crotonate
anion5Pyruvate
anion6Butyrate
anion7Lactate

まず、エクセルの方で次のような仕込みをしておきます.

  1. 変数名はヘッダー+通し番号とする
  2. 変数名とラベル(物質名)の対応表を作っておく

そして、ラベルを付ける方法はいろいろあると思うのですが、Do fileを作ってしまう、というのがトリックになります.

変数名とラベルだけが入ったテーブルをインポートします.

import excel "label_list.xlsx", sheet("label") firstrow allstring clear

次に、新たにカラのdo-fileを作るために、tempname fhとして新しい一時変数を作成します.これ自体にはあまり意味がなく、ただただ新しくdo-fileを開くのに必要みたいです.

list variable label
tempname fh
local N = _N

ここで全部で何個の変数があるかを表すために(すなわち作業の終点を表します)ローカルマクロに格納しておきます.

// create a new do-file
file open `fh' using my_labels.do , write replace

新しいdo-fileを創ったらそこに次々にラベルの定義方法のコマンドを書き込んでいきます.

forvalues i = 1/`N' {
    file write `fh' "label variable `= variable[`i']' "
    file write `fh' `""`= label[`i']'""' _newline
}
file close `fh'

そして最後にこのコマンドを実行するとそこにある変数名にすべてラベルが付与される、という仕掛けです.

// Command through the new dofile
do my_labels.do

先日500個余りの代謝物にすべてラベルを振らねばならないとなったときにこれを使いましたが、ほんの一瞬でした.

個々の代謝物は、anion1, anion2, cation1, cation2, みたいな名づけをしているためにループを作りやすくなっていました.それにこの方法を組み合わせれば無敵ですね.

コメント

タイトルとURLをコピーしました