社会ノマド

備忘録と書きもの練習帳。とくに何らかのハンドリング系と、雑多な話題に関する読書録になるかなと思います。

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")

MacWindowsの間の文字コードトラブルは絶えませんね。とはいえまだラベルで読んでいるので分析しづらい。値にすべくラベルをキャンセルしてみる。

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がでかすぎるからプレビューで圧縮しよう。

【OSX】PDF のファイルサイズをプレビュー.app で小さくする

上記でQuartzのパラメタを設定できるらしい。そこでhogeと名付けて設定したのだが、 名前を付けて保存のところに表示されない…

どうやら以下が原因らしい。 「$HOME/Library/Filters/ のQuartzフィルタは、プレビュー.appには表示されない」

独自のPDFのQuartsフィルタを追加する

ということは移動すればいいのではと思い調べていたらあった。

プレビューのPDF書き出しでバイト数を削減しようとQuartzフィルタを設定しても一覧に表示されなくて困ったら

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と返してくる。

ひとまずこれで、いちいち対話しなくても動かせる。

参照

6. モジュール — Python 2.7.x ドキュメント

オブジェクトの名前を関数内で使いたい

問題点

ohayouって名前のオブジェクト名がついたデータフレームがあった時、ohayou.csvにして保存する関数が欲しい場合の解決策。問題は、関数名に渡したohayouを引数内で名前に使おうと思っても使えない。つまり オブジェクト名にアクセスできない

解決策

deparse()とsubstitute()を使えばいける らしい。以下に保存の関数を書いた。いくつかのデータセットをfor文で順番にこの関数に投げればしかるべく名前で保存されていく。

save<- function(data){
  savename<- paste(deparse(substitute(data)),".csv",sep="")
  write.csv(data,savename)
}

Rで一歩メタに踏み出した。