いつものパスタブログ

研究とか,Rとか

学生生活実態調査の文字コード

文字コードがカオスで調べるのが大変だったのでメモ

年次 当該データ 文字コード URL
1991 0078.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0078
1992 0079.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0079
1993 0053.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0053
1994 0080.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0080
1995 0125.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0125
1996 0126.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0126
1997 0127.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0127
1998 0128.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0128
1999 0157.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0157
2000 0201.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0201
2001 0267.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0267
2002 0292.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0292
2003 0345.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0345
2004 0399.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0399
2005 0519.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0519
2006 0562.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0562
2007 0605.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0605
2008 0664.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0664
2009 0753.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0753
2010 0812.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0812
2011 0841.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0841
2012 0879.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0879
2013 0955.sav utf8 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=0955
2014 1057.sav utf8 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=1057
2015 1099.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=1099
2016 1163.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=1163
2017 1232.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=1232
2018 1295.sav utf8 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=1295
2019 1384.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=1384
2020 1442.sav cp932 https://ssjda.iss.u-tokyo.ac.jp/Direct/gaiyo.php?eid=1442

新しいパソコンを買ったらやること

新しいパソコンの初期設定

Google Chromeのインストール

Office関連のインストール

  • Office365のインストール
  • Onedriveのインストール

特に問題なくできた

Homebrewのインストール(Mac

  • 定番のパッケージマネージャー

brew.sh

R関連のインストール

  • R本体のインストール
brew install --cask r
  • Rstudioのインストール
brew install --cask rstudio
  • 自作したRstudioテーマを持ってくる(あとでgithubにでも置いておく)
  • エディタで使用するフォントを選択
    • myricaを使いたかったが,なぜかMacだとうまくいっていない(調査中)
  • Rtools(Windows)or XcodeMac)のインストール
    • github産のパッケージのビルドなどに必要
  • Macのみ)Xquartzのインストール
    • 詳しくはわからないが,入れないとRmarkdownがちゃんと動かなかった

gitのインストール

  • (winのみ)gitをインストール
    • macだとgit自体がすでにインストールされていた
  • ssh keyの作成→githubへ登録
  • git clone で適宜必要なプロジェクトをダウンロード

Rmarkdown関連のインストール

  • tinytexのインストール
  • tinytex::install_tinytex()tex本体をインストール
  • latex_engine: lualatexの文章を作成し,エラーを見ながら適宜tinytex::tlmgr_install()で足りないパッケージを追加
    • Mac)haranoajiで引っかかった

Zoteroのインストール

  • 同期の開始
    • 「環境設定」の「同期」からユーザー名,パスワードを打ち込んで同期を開始
    • 「詳細」→「ファイルとフォルダ」から,基本ディレクトリを正しく設定する→pdfファイルと文献情報が紐づいた形で設定が引き継がれる

あとは以下を参考に設定する

sickle-sword.hatenablog.com

Zoteroの設定備忘録

ようやく始めた文献管理

先日ようやく文献管理をはじめた.
社会学周りだと,ここらへんのメソッドが全く確立されていない&共有されないので,試行錯誤が大変だった.
以下では自分なりに見つけた方法をメモっていく.(メモらないと絶対忘れる)

Zoteroのインストール

なにはともあれZotero本体のインストール.
zotero install」みたいな感じで適当にググったら出てくる. https://www.zotero.org/download/

インストール時の注意とかも特になし.サクサク進める.

ブラウザコネクタのインストール

Zoteroを起動して「ツール」>「ブラウザ・コネクタのインストール」をクリック.
するとウェブブラウザが立ち上がるので,自分が使うブラウザのコネクタをインストールする.
これも作りが丁寧でわかりやすいのでサクサク進める.

はじめにやっとく設定

「編集」>「設定」からやっておいた方がいい設定をいじる(Macだと「Zotero」>「環境設定」)

  • 一般
    • 「ウェブページからアイテムを作成するときに自動的にスナップショットを作成する」のチェックを外す
    • ゴミ箱の中のアイテムを7日(お好きなように)経過で削除
  • 同期
    • データの同期,作ったアカウントでログインしておく
    • ファイルの同期,すべてチェックを外す(pdfはOnedriveに保存するので使わない)
  • 詳細
    • ファイルとフォルダ,リンク付き添付ファイルの基本ディレクトリを,pdfを保存したいディレクトリに設定する(自分の場合はOnedrive>Zotero

アドオンのインストール

Zoteroオープンソースなので,便利なアドオンをいろんな人が作ってくれている.
以下ではZotFileとBetter-BibTexの二つを導入する.

ZotFileの導入

  1. まずはアドオンをダウンロードしてくる.http://zotfile.com/index.html#changelog
  2. xpi形式のファイルがダウンロードされるので,適当なフォルダに保存する(自分はProgram FilesのZoteroのフォルダにAddonというフォルダを作って入れている).
  3. Zoteroを起動し,「ツール」>「アドオン」をクリックすると現在インストールされているアドオンのリストが表示されるので,右上の歯車アイコンで「Install Add-on from File...」をクリック
  4. 先ほど保存したxpi形式のファイルを選択.Zoteroを再起動しろと言われるので,Restart nowをクリック

これでインストールは完了.

pdfの保存先を設定する

google scholarやjstageなどから,ブラウザコネクタを使って文献を落としてきたときに,pdfファイルを保存するフォルダを任意に設定できる.自分はOnedrive内のフォルダを指定することでiPadなどから文献にアクセスできるようにしている.

  1. 「ツール」>「ZotFile Preferences...」>「General Settings」>「Location Files」と進む
  2. Custom Locationの横のChoose...を選択し,pdfを保存したいディレクトリを選択する
  3. Use subfolder defined byにチェックを入れ,横に「/%c」と入力する

最後の行はフォルダ内にサブフォルダを作るかどうかで,「/%c」はZoteroのコレクションに対応する形でサブフォルダを作る設定.もちろん著者(「/%a」)や年度(「/%y」)でサブフォルダを作ることもできる.

pdfファイルの名前を設定する

同じくブラウザコネクタ経由で文献を落としてきたときに,pdfファイルの命名規則を定めることができる.

  1. 「ツール」>「ZotFile Preferences...」>「Renaming Rules」>「Renaming Format」と進む
  2. Use Zotero to Renameのチェックを外す
  3. Format for all Item Types except Patentのところに「{%a_}{%y_}{%t}」と入力する

最後のところが命名規則で,「著者_年度_タイトル」という名前がpdfファイルにつくことになる.ここも先ほどと同じで任意に規則を作ることができる.
命名規則を設定してから,文献を右クリックして「Manage Attachments」>「Rename Attachments」とすると,pdfファイルがリネームされる.

Better BibTeXの導入

導入の流れは先ほどと同じ. ダウンロード元はGithubのreleaseから. https://github.com/retorquere/zotero-better-bibtex/releases

Cite Keyの自動生成

Bibtexで引用する際に使用するCitekeyをいい感じで自動生成してくれる.

  1. 「編集」> 「設定」>「Better BibTeX」>「Citation keys」とすすむ
  2. 「Citation key format」のところに「[Auth]-[year]」と入力
  3. となりの「Export」に移って,「Fields to omit from export」のところに「abstract, doi, file」と入力
  4. 「Advanced」に移って,「Ideographs in citekeys」の「Apply kuroshiro romajization in Japanese names/titles」のところにチェックをいれる

2のところがCitation keyの命名規則で,「著者-年」という形で生成される.もちろんTitleなどを組み合わせてカスタマイズできる. 3はBibtexファイルの出力時にabstractやdoiを出力しないという設定(ファイルが長くなって邪魔くさいので...). 4は著者名に日本語が含まれている場合に読みを抽出してローマ字化し,Citation keyに利用するという設定.完全に正確ではないが,今のところは不自由なく使えていると思う.

J-StageのTranslatorの修正

社会学だと主要な邦ジャーナルはjstageからダウンロードすることになるが,そのままだと著者名とタイトルがうまく取れないという問題がある.

  • 著者名:姓と名が反対でとれてしまう.これが連鎖的にpdfのファイル名にまで影響してくる
  • タイトル:サブタイトルがとれない.このままだと手動入力することになる.

これを,JstageのTranslatorを修正することで対応する.
Zoteroのデータフォルダ(Windowsの場合Users)内のTranslatorsの中にある「J-Stage.js」を開く.

87行目あたりから以下のように修正する.

// get RIS Link
    //var bibtexurl = ZU.xpathText(doc, '//a[contains(text(), "BIB TEX")]/@href'); // コメントアウト
    var risurl = ZU.xpathText(doc, '//a[contains(text(), "RIS")]/@href'); // 追加
    // ZU.doGet(bibtexurl, function (text) { // コメントアウト
    ZU.doGet(risurl, function (text) { //追加
        // var bibtex = text; // コメントアウト
        if (text.match(/TI  - .+?\nTI  -  \n/)) { // 追加
            var bibtex = text.replace("TI  - ","TIT  - ").replace("\nTI  -  \n","\n").replace("TIT  - ","TI  - "); // 追加
        } else { // 追加
            var bibtex = text.replace("TI  - ","TIT  - ").replace("\nTI  - ","――").replace("TIT  - ","TI  - "); // 追加
        } // 追加
        // Zotero.debug(bibtex)
        var translator = Zotero.loadTranslator("import");
        // translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); // コメントアウト
        translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");  // 追加

何をしているかを簡単に解説すると,まずjstageから情報を取ってくるときのソースをBibtexからRISに変更している.こうすることでBibtexに適用される日本人著者のオリジナルルールを回避する.
またjstageが提供するRISファイルの中身を見るとタイトルを保存するフィールド(TI)が二つ用意されていることがわかるので,二つとも埋まっている(サブタイトルがある)ときはそれを「――」でつないで結合している(7~11行目)

社会学評論のcslファイル

社会学でよく使われる社会学評論スタイル準拠のCSLファイルを作ってみた. 現状,英語と日本語は別ファイルで,学術論文と本の章は対応している.(2021-08-29)

github.com

参考文献

文献管理ソフト Zotero ~ 設定編~ - humosy’s blog

Zoteroで日本語文献のまともなBibTeX作成 - Qiita

  • jstage周りの設定について

J-STAGEの論文をZoteroに取り込む – 分析室の屋根裏

J-Stage Translator updated - Zotero Forums

Rでロジットモデル

Rで多項ロジット,順序ロジットの最適解が何か迷っていたが,ひとまず見つかったっぽいのでメモ

二項ロジット

これは簡単で,2値のfactorを従属変数,リンク関数をglm(family = binomial('logit'))のように指定してやればOK
ちなみにbinomial('probit')にしてやればプロビット回帰になる

多項ロジット

nnet::multinomは検定とかやってくれないし,かといってmlogit::mlogitは独自のデータ形式を要求してくるので面倒くさい.ただ,nnetbroomに対応しているので,検定部分はbroomに任せることでこの問題は解決.
ということでこれからはnnetで推定→broomに放り込んで検定というのを使っていきたい

順序ロジット

MASS::polrが最有力か?ただし,data.frame形式しか受け付けていないのでtibbleのままデータを入れるとエラーになるのが難点.以前LMestで潜在移行モデルを動かした時にも似たようなことがあった.なんとかならんものか...
ちなみにpolrってなんだろうと思ったら,proportional odds logistic regression(比例オッズロジスティック回帰)の略でした.

一般化順序ロジット

平行性の仮定を一部緩めた部分比例オッズモデル(partial proportional odds model)1とかをやりたいときは,VGAM::vglmが使える.
x1,x2,x3のうち,x1だけ平行性の仮定を緩めたいときは,以下のように書く

VGAM::vglm(formula = y ~ x1 + x2 + x3, 
           family = VGAM::cumulative(parallel = FALSE ~ 1 + x1, reverse = TRUE),
           data = data) 

parallelの書き方がミソで,parallel = FALSEのあとに等値制約を緩めたいパラメタをformulaで記述する.今回の場合は切片(閾値)とx1の係数だけは各段階で異なるので~ 1 + x1と記述する.また,parallel = TRUEとすると通常の順序ロジットモデルになる.
reverseは係数の符号を反転させるオプションで,reverse = TRUEを入れるとStataのgologit2を用いた時の結果と同じになる.


  1. 教育社会学での使用例は近藤・古田(2009)とか.

Stata学習奮闘記(4日目)

sickle-sword.hatenablog.com

前回の記事はこちら

回帰分析

今回は社会科学の計量分析の基本となる回帰分析を行う.
- 従属変数y,独立変数x1, x2の回帰分析

reg y x1 x2

回帰系の変数の並べ方は共通なのでここでしっかり覚えておきたいところ

オプション

  • beta:標準化偏回帰係数を出力
  • vce(ols, robust, cluster...):標準誤差の補正方法(誤差項の分散不均一や級内相関の問題に対処する)通常はols,robustでロバスト標準誤差,clusterでクラスタロバスト標準誤差,他にbootstrapやjackknifeなどもある

二項ロジスティック回帰

二値変数に対して回帰モデルを適用するときは,二項ロジスティック回帰がよく用いられる.
- 従属変数y,独立変数x1, x2の二項ロジット

logit y x1 x2

regのところをlogitに書き換えるだけ.かんたん.
また,ロジスティック回帰は実際には
y = \log{\frac{p}{1-p}} = \alpha + \beta_1x_1 + \beta_2x_2
として推定を行っているので,実際に解釈を行う時は\exp(\beta_1)のようにオッズ比に直してから解釈するのが望ましい.
stataではlogisticというコマンドで推定を行うことで,オッズ比を出力できる.

logistic y x1 x2

多項ロジット,順序ロジット

それぞれ,mlogit ologitで実現できる

従属変数のカテゴリをA,B,Cの3カテゴリとすると,多項ロジットモデルは以下の式で表現される

\log{\frac{p_A}{p_C}} = \alpha_A + \beta_{1A}x_{1A} + \beta_{2A}x_{2A}
\log{\frac{p_B}{p_C}} = \alpha_B + \beta_{1B}x_{1B} + \beta_{2B}x_{2B}

解釈の上ではAとCのオッズ比,BとCのオッズ比を見ることになるので,「AとCを比較すると...,BとCを比較すると...」という解釈になる点に注意

また,A<B<Cという順序があるときは順序ロジットモデルを検討する
順序ロジットモデルは以下の式で表現される

\log{\frac{p_A}{p_B + p_C}} = \alpha_1 - (\beta_1x_1 + \beta_2x_2)
\log{\frac{p_A + p_B}{p_C}} = \alpha_2  - (\beta_1x_1 + \beta_2x_2)

このとき,\alpha_1, \alpha_2閾値と呼ばれ,例えば\beta_1x_1 + \beta_2x_2閾値\alpha_1を超えるとき,ある個体はAよりはBまたはCに属している確率が高いということになる.同様にして,\beta_1x_1 + \beta_2x_2閾値\alpha_2を超えるとき,ある個体はCよりはAまたはBに属している確率が高いということになる.

多項ロジットモデルと順序ロジットモデルを比較すると,順序ロジットモデルの方が推定するパラメータが少ない(偏回帰係数部分が二つの方程式で共通している)ので倹約的なモデルと言える.
一方で,これは各カテゴリ間で独立変数の効果は等しいという平行性の仮定を置いていることになる.
カテゴリ間で独立変数の効果が異なると考えられる場合は,平行性の仮定を一部緩めた一般化順序ロジットモデル(部分比例オッズモデル)を用いる.

演習

今回は年収に関する回帰分析と,結婚状態に関する多項ロジスティック回帰分析を行う
データセットはまたまたgss_catを用いる

変数の作成

* リコード
recode marital 1=. 2=1 3/5=2 6=3, gen(marital_r)
recode race 1=1 else=0,gen(other_dum)
recode race 2=1 else=0,gen(black_dum)
recode rincome 1/3=. 4=275 5=225 6=175 7=125 8=90 9=75 10=65 11=55 12=45 13=35 14=20 15=7 16=., gen(rincome_r)
  • marital_r:maritalのうち,Never marriedを1,Separated,Divorced,Widowedを2,Marriedを3,それ以外を欠損とするカテゴリ変数
  • other_dum, black_dum:raceよりそれぞれダミー変数を作成
  • rincome_r:単位は100$とし,No answer, Don't know, Refused, Not applicableは欠損, $25000 or moreは275,Lt $1000は7を割り当て,それ以外は中央値をとった連続値として扱う

回帰分析

  • 人種と年齢で収入を説明するモデル
reg rincome_r age other_dum black_dum
      Source |       SS           df       MS      Number of obs   =    12,990
-------------+----------------------------------   F(3, 12986)     =    143.45
       Model |  3204110.72         3  1068036.91   Prob > F        =    0.0000
    Residual |  96682857.7    12,986  7445.16076   R-squared       =    0.0321
-------------+----------------------------------   Adj R-squared   =    0.0319
       Total |  99886968.4    12,989  7690.11998   Root MSE        =    86.285

------------------------------------------------------------------------------
   rincome_r |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
         age |   1.005081   .0567376    17.71   0.000     .8938673    1.116295
   other_dum |  -13.87686   2.597621    -5.34   0.000    -18.96857   -8.785139
   black_dum |  -16.07347   2.184441    -7.36   0.000     -20.3553   -11.79165
       _cons |   171.8531   2.606982    65.92   0.000      166.743    176.9631
------------------------------------------------------------------------------

この表で見ると,年齢が1歳増加すると,収入が約100$増える計算になる.また,白人に比べて黒人,その他の人種では年収が低い傾向が見られる.

多項ロジスティック回帰

  • 次に年齢,収入,人種で結婚状態を説明するモデルを考える
mlogit marital_r age rincome_r other_dum black_dum
Iteration 0:   log likelihood = -13580.902  
Iteration 1:   log likelihood = -11984.316  
Iteration 2:   log likelihood = -11889.405  
Iteration 3:   log likelihood = -11888.587  
Iteration 4:   log likelihood = -11888.587  

Multinomial logistic regression                 Number of obs     =     12,988
                                                LR chi2(8)        =    3384.63
                                                Prob > chi2       =     0.0000
Log likelihood = -11888.587                     Pseudo R2         =     0.1246

------------------------------------------------------------------------------
   marital_r |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
1            |
         age |   -.084764   .0022371   -37.89   0.000    -.0891485   -.0803795
   rincome_r |  -.0024897   .0002676    -9.30   0.000    -.0030142   -.0019651
   other_dum |  -.0007778   .0742666    -0.01   0.992    -.1463376    .1447819
   black_dum |   1.002292   .0655115    15.30   0.000     .8738915    1.130692
       _cons |   3.088205   .0947333    32.60   0.000     2.902531    3.273879
-------------+----------------------------------------------------------------
2            |
         age |   .0216207   .0017648    12.25   0.000     .0181617    .0250798
   rincome_r |  -.0014875   .0002688    -5.53   0.000    -.0020143   -.0009607
   other_dum |  -.1703381   .0839494    -2.03   0.042    -.3348759   -.0058002
   black_dum |   .6633073   .0671812     9.87   0.000     .5316346      .79498
       _cons |  -1.496222     .10627   -14.08   0.000    -1.704508   -1.287937
-------------+----------------------------------------------------------------
3            |  (base outcome)
------------------------------------------------------------------------------

未婚と結婚の対比(1vs3)で見ると

  • 年齢が低い=若いと未婚の傾向にある
  • 収入が低いと未婚の傾向にある
  • 黒人だと未婚の傾向にある一方,白人とその他人種の間ではそうした傾向はない

また別居・離婚・死別と結婚の対比(2vs3)で見ると

  • 年齢が高いと,別居・離婚・死別の傾向にある
  • 収入が低いと,別居・離婚・死別の傾向にある
  • 黒人と白人を比較すると,黒人の方が別居・離婚・死別の傾向にあり,白人とその他人種を比較すると,白人の方が別居・離婚・死別の傾向にある

前回のクロス表の分析と比較しても,白人と比較した時に黒人は未婚の人の割合が高く, 現在結婚している人の割合が低いことは一致している.
前回はこの理由を経済状況を用いて説明しましたが,今回は収入を統制してもこのような傾向が見られたので,別の説明が必要と考えられる.

Stata学習奮闘記(3日目)

前回の記事はコチラ sickle-sword.hatenablog.com

クロス表

いよいよ今回から変数間の関係を見る分析を行っていきます。
最初はカテゴリカルデータ分析の基本となるクロス表から。

  • x1とx2のクロス表
tab x1 x2

tabは以前度数分布表を出力するコマンドとして登場していました。
変数を2つ入れれば自動的にクロス表で出力してくれます。

クロス表のオプション

tab x1 x2のあとにカンマを打ち,その後ろにオプションをつけることができます。
以下ではよく使うやつを紹介

  • row col cell:それぞれ行パーセント,列パーセント,セルパーセントを出力
  • chi2(ch):ピアソンのカイ二乗検定
  • lrchi2(lr):尤度比(likelihood ratio)カイ二乗検定
  • V:クラメールのV
  • gamma(g):グッドマン=クラスカルのガンマ

tab1とtab2

クロス表と度数分布表はともにtabであった

ただ,「変数x1とx2の度数分布表を一度に作りたい!」ということもある。
Stataはrecode x1 x2 ...のように変数を並べて書くことで並列処理ができることが多く, 感覚的にはtab x1 x2と書きたくなる。しかしこれではクロス表が出力されてしまう。

そこで度数分布表専門のtab1とクロス表専門のtab2がある。
tab1で変数を複数並べても,クロス表にはならずに複数の度数分布表が出力できる。

演習

実際にデータを使ってやってみましょう
使用するデータは前々回作ったgss_catです。

変数のリコード

今回は人種ごとに婚姻状況に違いがあるのかを検討します。
marital(婚姻状況)には,No answer,Never married,Separated,Divorced,Widowed,Marriedの6カテゴリがあります。 今回はリコードの練習を兼ねて,Separated,Divorced,Widowedをまとめて1カテゴリにします。また,No answerは欠損値にします

gen marital_r=marital
recode marital_r (1=.)(2=1)(3=2)(4=2)(5=2)(6=3)
  • (追記)もっと短く書けたようです
recode marital_r 1=. 2=1 3/5=2 6=3

リコードが上手くいったか確認

tab marital marital_r

              |            marital_r
      marital |         1          2          3 |     Total
--------------+---------------------------------+----------
Never married |     5,416          0          0 |     5,416 
    Separated |         0        743          0 |       743 
     Divorced |         0      3,383          0 |     3,383 
      Widowed |         0      1,807          0 |     1,807 
      Married |         0          0     10,117 |    10,117 
--------------+---------------------------------+----------
        Total |     5,416      5,933     10,117 |    21,466 

それぞれの変数の度数分布を確認

tab1を使って度数分布表を一気に作ってみます

tab1 race marital_r

-> tabulation of race  

          race |      Freq.     Percent        Cum.
---------------+-----------------------------------
         Other |      1,959        9.12        9.12
         Black |      3,129       14.57       23.68
         White |     16,395       76.32      100.00
---------------+-----------------------------------
         Total |     21,483      100.00

-> tabulation of marital_r  

  marital_r |      Freq.     Percent        Cum.
------------+-----------------------------------
          1 |      5,416       25.23       25.23
          2 |      5,933       27.64       52.87
          3 |     10,117       47.13      100.00
------------+-----------------------------------
      Total |     21,466      100.00

クロス表分析

raceとmarital_rのクロス表を作ります。
その際,行パーセント,カイ二乗統計量も出力します。

tab race marital_r, row ch lr

+----------------+
| Key            |
|----------------|
|   frequency    |
| row percentage |
+----------------+

               |            marital_r
          race |         1          2          3 |     Total
---------------+---------------------------------+----------
         Other |       633        392        932 |     1,957 
               |     32.35      20.03      47.62 |    100.00 
---------------+---------------------------------+----------
         Black |     1,305        953        869 |     3,127 
               |     41.73      30.48      27.79 |    100.00 
---------------+---------------------------------+----------
         White |     3,478      4,588      8,316 |    16,382 
               |     21.23      28.01      50.76 |    100.00 
---------------+---------------------------------+----------
         Total |     5,416      5,933     10,117 |    21,466 
               |     25.23      27.64      47.13 |    100.00 

          Pearson chi2(4) = 825.7121   Pr = 0.000
 likelihood-ratio chi2(4) = 818.5358   Pr = 0.000

カイ二乗検定は0.1%水準で有意です。
また,行パーセントをみると,白人と比較した時に黒人は未婚の人の割合が高く, 現在結婚している人の割合が低いことがわかります。
アメリカ社会では人種間で経済状況が異なり,それが婚姻に影響していると考えれば, 妥当な結果と言えるのではないかと思います。

Stata学習奮闘記(2日目)

前回の記事はコチラ sickle-sword.hatenablog.com

変数の選択・削除

  • 変数x1とx2を削除
drop x1 x2
  • 変数x1とx2だけを残す(それ以外は削除)
keep x1 x2

簡単ですね。
Rで同じことをやるならdplyr::selectでしょう

library(dplyr)
# x1とx2を削除
select(df, -x1, -x2)

# x1とx2だけ残す
select(df, x1, x2)

ちなみにdplyrのselectでは,x1からx9までを残す・消すのような動作をよくやります。

select(df, x1:x9)
select(df, -x1:-x9)

みたいなやつです。
これは,

keep x1-x9
drop x1-x9

のような感じで実現できます。
この-(ハイフン)で変数をつなぐ記法は,recodeなどでも使えるようです(後述)。

変数の作成

シンプルに変数をリコードする場合

  • 変数のコピー
    新しい変数を作るときに,元の変数をそのままリコードすると,ミスのチェックが難しくなる。 そのため一度変数をコピーしてからリコードを行うのが吉。
* 変数x1から変数x2を作成
gen x2=x1
  • 変数の変換
* 1は1,2と3が2,4が3,9が欠損になるように変換
recode x2 (1=1)(2=2)(3=2)(4=3)(9=.)

(以前の値=新しい値)という書き方。Stataでは欠損値は.(ピリオド)で指定する。

ちょっと複雑な場合

recodeでは変数の値を一対一対応で指定したが,より複雑なケース,例えば一対一で指定するには面倒な量的変数や,外部変数の値を参照してリコードを行うケースには対応できない。
そこで以下ではgen,replaceとifを組み合わせてリコードを行う。

  • x1の値が10以上なら1,それ以外なら0のダミー変数x2を作成
gen x2=1 if x1>=10
replace x2=0 if x1<10
  • x1が1かつx2が1なら1,それ以外なら0のダミー変数x3を作成
gen x3=1 if x1==1 & x2==1
replace x3=0 if x1!=1 | x2!=1

Stataってelseないんですか…?けっこう面倒くさい

  • Rだとif_elseがあります
mutate(data,
       x2 = if_else(x1 >= 10, 1, 0)
       )
  • あとcase_whenが個人的には一番よく使う
    とても柔軟で好き
mutate(data,
       x2 = case_when(x1 >= 10 ~ 1,
                      is.na(x1) ~ NA_real_,
                      TRUE ~ 0)
       )

ただし,柔軟すぎて欠損値まで書き換えてしまうので明示する必要がある。(if_elseはNAはそのままNAになる)

  • ちなみにStataのrecodeを模したdplyr::recodeもある
# 1は1,2と3が2,4が3,9が欠損になるように変換
mutate(data,
       x2 = recode(x1, `1` = 1, `2` = 2, `3` = 2, `4` = 3, `9` = NA_real_))