このブログでは、統計解析ソフトStataのプログラミングのTipsや便利コマンドを紹介しています.
Facebook groupでは、ちょっとした疑問や気づいたことなどを共有して貰うフォーラムになっています. ブログと合わせて個人の学習に役立てて貰えれば幸いです.
以前、非線形の関係を図で表現するRestricted cubic splines(RCS)をStataで実行するための方法を解説しました.
いろんな方から様々な「うまくいかない事例」に関するご相談を受けました.今回はそういったことを他の皆さんと共有するコーナーを用意してみました.
事例1.invalid name
これはあらゆるコマンドで共通することですが、変数名を間違えると無情にもこのようにはじかれますのでご注意ください.
今回のケースでは変数名”var3″となっているはずが、”var 3″と間にスペースを入れてしまったがために生じた悲劇です.一度このようなミスを犯すとなかなか気づくのが難しいものです.
また、全角スペースも気づきにくいです.あとは変数名やラベル名をGUIから入力したときに、スペースを最後に入れてしまったりするとそのスペースが変数名の一部と認識されてしまうことがあります.そんなときには一度変数の後ろのスペースを消してもう一度半角スペースを入れてみたりするとうまくいくことがありますのでお試しあれ!
事例2.value xxx of varname not observed (levelsof, xblcコマンド)
これはちょっと根が深い問題です.エクセルを読み込んだあととか、あるいはStataの上で計算したあとなどにlevelsofでその変数の中に含まれる数列を読み込ませると、9.1999999とか、5.90000001みたいな変な数字が出てきてしまう事があります.
これをround upしてきれいにしないとコマンドが走らないことがあります.(元の変数と少しでも一致しないと走らないということのようです)
このメカニズムがどうなっているかよくわからないのですが、とにかく桁をへらそうと頑張っていました.
(2022/4/8 修正・追記)
一番簡単なのはround関数を使うことです.
これであれば桁数も指定することができます.
replace var = round(var, .01)
これなら小数点第2位までにすることができます.
さらに、変数のタイプを変更するだけでもうまくいくことがあるようですので、追記しておきます. (double→float)
recast float var, force
しかし、これも自分の手元のデータでは直しきれなかったことがあったので、とりあえず困ったらroundしてます.
事例3.if not allowed (xblcコマンド)
層別解析をしようと思ってifで区切ろうとしたところ、こんなコメントが帰ってきました.
これは簡単で、xblcの前に走らせたメインの回帰分析コマンドの中にif条件節をいれればよいです.
事例4.at() invalid — invalid numlist (levelsof, xblcコマンド)
これはlocalマクロを使うときも共通していますが、`lclmacro‘ 左側のアポストロフィの逆みたいな記号(`: backtick というみたいです)は日本のコンピューターキーボードでは@マークのところにあります.
shift + @ で出すことができます.これは海外のPCではキーボードの位置が違います.Pennsylvania大の疫学統計学の授業を受けていたときに記号の位置を知りたくて尋ねたところ、日本で買っていったPCだったため探すのに時間がかかった思い出があります.
右側はアポストロフィです.
事例5.生存時間分析で”[_cons] not found”と出てしまう
これはCox回帰を走らせた後に出てくるエラーです.
Cox回帰の結果はよく見ると他の回帰分析のときと違ってconstant termがありません.
xblcコマンドを走らせるときには必ずX軸のどこかの値をreferenceに指定してやる(つまりそこが基準になるのでY=1のラインと交差する)必要があります.そうしないと表題のようなエラーがでてしまう、というわけです.
まとめ
こういったトラブルシューティングに関する質問が来るというのは、きちんと活用して頂いている証拠でもあると思います.もとの記事も少し修正を加えてみましたのでまたご確認頂ければ幸いです.
コメント
いつも勉強させて頂き、ありがとうございます。
事例2ですが、xblcがdouble型の変数は認識しないようで、floatに変更するとうまく行きました。
これはライトストンの「Stataで簡単にためするスプライン補間」の第3回の資料内のp5に下記のように記載されていました。
「levelsofコマンドで指定する変数が少数を含み、且つdouble型の場合、その後のxblcで値が存在しないという旨のエラーが起きてしまいます。おそらくxblcコマンドがfloat型にしか対応していないことが原因だと考えられます。この場合、double型で保存されている値を別の変数に退避させ、元の変数の方はfloat型に変換をおこなってからlevelsofおよびxblcを実行すると成功します。」
gen age_double = age
recast float age, force
というコマンドでdouble型の変数をfloat型にしたら、確かに小数点がついているdouble型の変数でもうまくxblcが動き、RCSでグラフを描くことができました。
ご存知であれば申し訳ございません。
今後とも先生のサイトを活用させて頂きたいと思っておりますので、よろしくお願いします。
田中先生
わざわざお知らせいただきありがとうございます。変数タイプの変更で乗り切れたのですね!
勉強になりました。ありがとうございます。引き続き何かありましたらコメントお寄せください。