Stata で回帰表の記述統計 (そしてTex)
サンプルをそろえて記述統計
Stataで回帰をした後に記述統計を出したいが,サンプルが揃わない問題がある.
大きくは2つの問題
1. サンプルが揃わない(if で条件付けて解決)
2. カテゴリー変数のレファレンスグループが表示されない
* 1も2も解決されず sum cont1 cont2 i.cat * 1のみ解決 sum cont* i.cat if cont1!=. & cont2!=. & cat!=.3 * 一応解決 sum cont* ib9999.cat if cont1!=. & cont2!=. & cat!=.3
荒業としてカテゴリー変数のレファレンスとして存在しないレファレンスを指定するという手.これをコピペしてemptyの9999を削除すればおk.
さらにTex形式で吐きたい
texで吐こうとすると summarizeではできないので,コピペをしないのであれば他のコマンドを使うことになる.ただそうすると i.が使えない問題 が発生する.戦略として,ダミーを作成して他のコマンドでtexに吐く.
ダミー変数を作成
ta v1,gen(v1d) tabstat v1d*,s(mean sd min max) f(%5.2f)
latabstat や sutex2 も試したがいずれもi.に対応せず.関数書くしか無いのか(それは後の課題…)
ちなみに,summarizeを使う方ならラベルがくっついてくるけどコピペがめんどい.後者でやるとラベルを書き直すのがめんどい.どっちもどっちなんだよなぁ.
*パッケージインストールはこんな感じ *findit sutex2
.savをRで取り込む際のトラップ(mac)
SPSSを持っていないので.savファイルは開けない…。Rで.savを開く方法はあって以下のコードで読める。ちなみに筆者はMacです。
d <- read.spss("/Users/hogehoge/hoge.sav",to.data.frame =T)
問題点①SPSSに貼られたラベルで読み込んでいる
問題点②文字がきちんと認識されず
文字で認識されてしまっていて、しかもエンコードを指定しないとShift-JISをUTF-8で読むので、factorの
d <- read.spss("/Users/hogehoge/hoge.sav",to.data.frame =T, ,reencode="Shift-JIS")
MacとWindowsの間の文字コードトラブルは絶えませんね。とはいえまだラベルで読んでいるので分析しづらい。値にすべくラベルをキャンセルしてみる。
d <- read.spss("/Users/hogehoge/hoge.sav",to.data.frame =T, ,reencode="Shift-JIS",use.value.labels = F)
やっとまともなの出てきた…(facter -> numeric の闇は[R]numericとfactorの相互変換あたりを参照。)
Rの邪魔者<NA>
Rでcsvから取り込んだ際,NA
ではなくて <NA>
が入っている時がある。ナニコレ?!結論から言って factor型の空白(=""
) のよう。is.na()
とかis.nan()
にも引っかからないし悪戦苦闘…。
そんなときはcsvで読み込む際に以下のようなオプションを付けることが吉。汚いデータを扱うとこういうところで泣かされる…。
data <- read.csv("hogehoge.csv",header=F, na.strings=c("", "NULL"))
na.strings
オプションはどれを欠損にするかの指定。ここで空白セルも欠損指定しておけばfactorの空白が残ることなく、読み込む段階で普通の欠損値(NA)に変換してくれる。
python: 変数の値を名前にして保存(変数評価)
変数の名前を保存する際の名前にしたい。
import pandas as pd savename = 'むにゃたん' df = pd.DataFrame( {'name': ['一郎','二郎','三郎'], 'educ': ['大','大','高'], 'income': [1000,2000,500]})
このようなデータセットと変数があったとき、むにゃたん.csv
って名前でデータセットを保存したい。スクレイピングとかしてると、こういうことが結構ある(savename がリストになっててfor文で回すとか)。ところが以下ではエラーする。
df.to_csv(savename)
savename を変数と判断し評価してくれないので、値までいかないんだね。 そこで、以下みたいにしてみたけどこれもダメ。
df.to_csv(eval(savename))
もう方針を変えて、上記のコードを全部 string にして、後から eval()
で評価することに。以下で成功です。
import pandas as pd df = pd.DataFrame( {'name': ['一郎','二郎','三郎'], 'educ': ['大','大','高'], 'income': [1000,2000,500]}) savename = 'むにゃたん.csv' name = 'df.to_csv("'+savename+'")' eval(name)
これで、ディレクトリにむにゃたん.csv
が保存されたはず。
プレビューでpdfをまともに圧縮する
pdfがでかすぎるからプレビューで圧縮しよう。
上記でQuartzのパラメタを設定できるらしい。そこでhoge
と名付けて設定したのだが、 名前を付けて保存のところに表示されない…
どうやら以下が原因らしい。 「$HOME/Library/Filters/ のQuartzフィルタは、プレビュー.appには表示されない」
ということは移動すればいいのではと思い調べていたらあった。
root入ったりターミナル処理慣れていないので、そのあたりをマイルドにやると以下の操作でいけた。
Finderで「Comand+Shift+G」によりパス指定した移動ができるので、
Color-Syncユーティリティで作ったファイルをhogeとすると
「/Users/名前/Library/Filters」にあるhoge.qfilter
を「/Library/Filters」に移動。
プレビューで名前を付けて保存にhogeが表示されて解決。
python における import の使い方
pythonで単純なコード実行はわかってきた。関数定義もひとまずok。でも いちいち対話型に入れるのめんどい!! そこでモジュールをうまくimportをしてpythonと対話せずに読み込む方法をみる。つまるところ簡単な import のしくみ。
まずは import してみる
以下のファイルをtest.py
でディレクトリにしまう。chori()って関数の引数に与えた数字の文だけHelloって返してくれる。
def chori(x): print "Hello"*x
pythonでこのモジュールを読み込み、その中にある関数chori()にアクセスする場合は、メソッドを使って以下のように記述する。
# test.py の読み込み import test # 関数へのアクセス test.chori(2) # HelloHelloと表示
関数をメソッドではなくそのまま読み込む
関数をそのまま読み込む方法としては以下のようになる。
from test import chori chori(2) # HelloHelloと表示
ターミナルから.pyを起動して引数を渡す
ターミナルからpythonと対話しなくても関数を呼び出し引数を与える方法。ファイルの末尾に __name__
以下にょろっと加えてtest.py
で保存。
def chori (x): print "Hello"*x # ファイルの末尾にこれを加える if __name__ == "__main__": import sys chori(int(sys.argv[1]))
ターミナルにてpython test.py 2
とか入れるとHelloHello
と返してくる。
ひとまずこれで、いちいち対話しなくても動かせる。
参照
オブジェクトの名前を関数内で使いたい
問題点
ohayou
って名前のオブジェクト名がついたデータフレームがあった時、ohayou.csv
にして保存する関数が欲しい場合の解決策。問題は、関数名に渡したohayou
を引数内で名前に使おうと思っても使えない。つまり オブジェクト名にアクセスできない 。
解決策
deparse()とsubstitute()を使えばいける らしい。以下に保存の関数を書いた。いくつかのデータセットをfor文で順番にこの関数に投げればしかるべく名前で保存されていく。
save<- function(data){ savename<- paste(deparse(substitute(data)),".csv",sep="") write.csv(data,savename) }
Rで一歩メタに踏み出した。