学生生活実態調査の文字コード
文字コードがカオスで調べるのが大変だったのでメモ
新しいパソコンを買ったらやること
新しいパソコンの初期設定
Google Chromeのインストール
Office関連のインストール
- Office365のインストール
- Onedriveのインストール
特に問題なくできた
Homebrewのインストール(Mac)
- 定番のパッケージマネージャー
R関連のインストール
- R本体のインストール
brew install --cask r
- Rstudioのインストール
brew install --cask rstudio
- 自作したRstudioテーマを持ってくる(あとでgithubにでも置いておく)
- エディタで使用するフォントを選択
- myricaを使いたかったが,なぜかMacだとうまくいっていない(調査中)
- Rtools(Windows)or Xcode(Mac)のインストール
- github産のパッケージのビルドなどに必要
- (Macのみ)Xquartzのインストール
- 詳しくはわからないが,入れないとRmarkdownがちゃんと動かなかった
gitのインストール
Rmarkdown関連のインストール
- tinytexのインストール
tinytex::install_tinytex()
でtex本体をインストールlatex_engine: lualatex
の文章を作成し,エラーを見ながら適宜tinytex::tlmgr_install()
で足りないパッケージを追加- (Mac)haranoajiで引っかかった
Zoteroのインストール
- 同期の開始
- 「環境設定」の「同期」からユーザー名,パスワードを打ち込んで同期を開始
- 「詳細」→「ファイルとフォルダ」から,基本ディレクトリを正しく設定する→pdfファイルと文献情報が紐づいた形で設定が引き継がれる
あとは以下を参考に設定する
Zoteroの設定備忘録
ようやく始めた文献管理
先日ようやく文献管理をはじめた.
社会学周りだと,ここらへんのメソッドが全く確立されていない&共有されないので,試行錯誤が大変だった.
以下では自分なりに見つけた方法をメモっていく.(メモらないと絶対忘れる)
Zoteroのインストール
なにはともあれZotero本体のインストール.
「zotero install」みたいな感じで適当にググったら出てくる.
https://www.zotero.org/download/
インストール時の注意とかも特になし.サクサク進める.
ブラウザコネクタのインストール
Zoteroを起動して「ツール」>「ブラウザ・コネクタのインストール」をクリック.
するとウェブブラウザが立ち上がるので,自分が使うブラウザのコネクタをインストールする.
これも作りが丁寧でわかりやすいのでサクサク進める.
はじめにやっとく設定
「編集」>「設定」からやっておいた方がいい設定をいじる(Macだと「Zotero」>「環境設定」)
- 一般
- 「ウェブページからアイテムを作成するときに自動的にスナップショットを作成する」のチェックを外す
- ゴミ箱の中のアイテムを7日(お好きなように)経過で削除
- 同期
- データの同期,作ったアカウントでログインしておく
- ファイルの同期,すべてチェックを外す(pdfはOnedriveに保存するので使わない)
- 詳細
アドオンのインストール
Zoteroはオープンソースなので,便利なアドオンをいろんな人が作ってくれている.
以下ではZotFileとBetter-BibTexの二つを導入する.
ZotFileの導入
- まずはアドオンをダウンロードしてくる.http://zotfile.com/index.html#changelog
- xpi形式のファイルがダウンロードされるので,適当なフォルダに保存する(自分はProgram FilesのZoteroのフォルダにAddonというフォルダを作って入れている).
- Zoteroを起動し,「ツール」>「アドオン」をクリックすると現在インストールされているアドオンのリストが表示されるので,右上の歯車アイコンで「Install Add-on from File...」をクリック
- 先ほど保存したxpi形式のファイルを選択.Zoteroを再起動しろと言われるので,Restart nowをクリック
これでインストールは完了.
pdfの保存先を設定する
google scholarやjstageなどから,ブラウザコネクタを使って文献を落としてきたときに,pdfファイルを保存するフォルダを任意に設定できる.自分はOnedrive内のフォルダを指定することでiPadなどから文献にアクセスできるようにしている.
- 「ツール」>「ZotFile Preferences...」>「General Settings」>「Location Files」と進む
- Custom Locationの横のChoose...を選択し,pdfを保存したいディレクトリを選択する
- Use subfolder defined byにチェックを入れ,横に「/%c」と入力する
最後の行はフォルダ内にサブフォルダを作るかどうかで,「/%c」はZoteroのコレクションに対応する形でサブフォルダを作る設定.もちろん著者(「/%a」)や年度(「/%y」)でサブフォルダを作ることもできる.
pdfファイルの名前を設定する
同じくブラウザコネクタ経由で文献を落としてきたときに,pdfファイルの命名規則を定めることができる.
- 「ツール」>「ZotFile Preferences...」>「Renaming Rules」>「Renaming Format」と進む
- Use Zotero to Renameのチェックを外す
- 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をいい感じで自動生成してくれる.
- 「編集」> 「設定」>「Better BibTeX」>「Citation keys」とすすむ
- 「Citation key format」のところに「[Auth]-[year]」と入力
- となりの「Export」に移って,「Fields to omit from export」のところに「abstract, doi, file」と入力
- 「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)
参考文献
文献管理ソフト Zotero ~ 設定編~ - humosy’s blog
Zoteroで日本語文献のまともなBibTeX作成 - Qiita
- jstage周りの設定について
Rでロジットモデル
Rで多項ロジット,順序ロジットの最適解が何か迷っていたが,ひとまず見つかったっぽいのでメモ
二項ロジット
これは簡単で,2値のfactorを従属変数,リンク関数をglm(family = binomial('logit'))
のように指定してやればOK
ちなみにbinomial('probit')
にしてやればプロビット回帰になる
多項ロジット
nnet::multinom
は検定とかやってくれないし,かといってmlogit::mlogit
は独自のデータ形式を要求してくるので面倒くさい.ただ,nnet
はbroom
に対応しているので,検定部分は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を用いた時の結果と同じになる.
-
教育社会学での使用例は近藤・古田(2009)とか.↩
Stata学習奮闘記(4日目)
前回の記事はこちら
回帰分析
今回は社会科学の計量分析の基本となる回帰分析を行う.
- 従属変数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に書き換えるだけ.かんたん.
また,ロジスティック回帰は実際には
として推定を行っているので,実際に解釈を行う時はのようにオッズ比に直してから解釈するのが望ましい.
stataではlogisticというコマンドで推定を行うことで,オッズ比を出力できる.
logistic y x1 x2
多項ロジット,順序ロジット
それぞれ,mlogit ologit
で実現できる
従属変数のカテゴリをA,B,Cの3カテゴリとすると,多項ロジットモデルは以下の式で表現される
解釈の上ではAとCのオッズ比,BとCのオッズ比を見ることになるので,「AとCを比較すると...,BとCを比較すると...」という解釈になる点に注意
また,A<B<Cという順序があるときは順序ロジットモデルを検討する
順序ロジットモデルは以下の式で表現される
このとき,は閾値と呼ばれ,例えばが閾値を超えるとき,ある個体はAよりはBまたはCに属している確率が高いということになる.同様にして,が閾値を超えるとき,ある個体は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_))