LoginSignup
31
23

More than 5 years have passed since last update.

PythonとRを連携させて分散共分散構造分析(SEM)のパス図を出力したい

Last updated at Posted at 2016-08-24

動機

  • pythonでsemを行うモジュールが見つからない!
  • きれいなsem図を自動で出力したい
  • python上でRを使いたい
    • 分析のかゆいところに手が届くのはR(の気がする)
  • R vs Python:データ解析を比較によると  
    • 統計以外のタスクを行う場合は、Pythonの方が単純である
    • Rは一般的に、より統計をサポートしている

説 : pythonとRで補いあえば最強説

  • pythonのモジュールである「pyper」を使用することでRとpythonの連携が可能

python上でのpyperの設定

  • pyperのインストール
    pip install pyper

  • pyperをインポートしpyperのインデントを作成

    • 「RCMD=」でRのpathを指定する必要有(//で)
    • use_numpy='True', use_pandas='True'とすることでnumpy,pandas型のデータをRに読み込ませることが可能
python
import pyper 
import os
import numpy as np
import pandas as pd
#pyperのインデントを作成
r = pyper.R(RCMD="C:\\Program Files\\R\\R-3.2.5\\bin\\x64\\R", use_numpy='True', use_pandas='True')

Rでのsemプログラムファイル作成

  • 当初Rの「sem」パッケージを使用していましたが、エラーが続出し「lavaan」に切り替えました(泣)
  • lavaanの中のsem関数の方が設定が簡単でした。
  • このファイルの作成は「はじめての共分散構造分析 Amosによるパス解析」をlavaanでやってみるを参考にさせて頂きました。
  • Rには事前に使用するパッケージ「lavaan」,「semplot」をインストール済み
  • この「semplot」を使うと「lavaan」の推定結果の図を簡単に出力してくれるみたいです。
  • このRのプログラムはSEMのモデルを作成、推定し、パス図を.pngで保存するものです。
R(lavaan.R)
library(lavaan)
library(semPlot)

r <-  cor(dat)

model1 <- ('
  reach=~a1*Intermediate_test+a2*term_end_exam+a3*minitest
  skill=~b1*mock_examination1+b2*mock_examination2+b3*mock_examination3 
  reach~~skill
  ')

fit <- sem(model1, sample.cov=r, sample.nobs=284)


png("C:\\Users\\xxxxxxxx\\Documents\\Python Scripts\\python_R\\semplot.png") 
semPaths(fit, "std", edge.label.cex = 1,line = 3, curvePivot = TRUE,
         sizeMan = 8, sizeInt = 1, sizeLat = 8)
dev.off()

pythonとRを連携させる

  • pythonにデータを読み込ませる
python
test = pd.read_csv("C:\Users\xxxxxxx\Documents\R\input\data\ch14sem.csv")
  • pythonのデータをRに渡す
    • 「test」を「dat」としてRに渡します。
python
r.assign("dat", test)
  • Rのファイルである「lavaan.R」をpythonで実行
python
r("source(file='C:\\Users\\xxxxx\\Documents\\R\\input\\script\\lavaan.R')")
  • r.get(" ")でR内のオブシェクトの抽出が可能
python(相関行列の抽出)
 r.get("r")
  • r(" ")でpython上でRのコマンドをpython上で実行し、その結果を出力することが可能
python(推定結果表示)
print r("summary(fit, standardized=TRUE, fit.measure=TRUE)")

出力されたパス図

semplot.png

このパス図はsemPlot Examples | - Sacha Epskampによると細かいところまで設定できるみたいです。(これでいちいちパワポやdraw.ioでパス図を描かなくてもよくなればいいな。。)

詰まったところ

  • R上でインデントを整えないとR上でエラーが出なくてもpython上でエラーが出てしまう。
  • R上でのplotはpythonにr.get("")で持ってこれないが.pngは出力されていました。
  • パスの指定に//を使うこと。

参考にさせて頂いたサイト

Rを使った分析(SEM)

http://mizumot.com/handbook/?page_id=625

「はじめての共分散構造分析 Amosによるパス解析」をlavaanでやってみる

https://sites.google.com/site/officeoga/r/hajimeteno

Python と R で連携する

http://qiita.com/ynakayama/items/f84dc659f1337d71dd9e

PypeR

http://www.webarray.org/softwares/PypeR/

R vs Python:データ解析を比較

http://postd.cc/r-vs-python-head-to-head-data-analysis/

semPlot Examples | - Sacha Epskamp

http://sachaepskamp.com/semPlot/examples

31
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
23