Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
23
Help us understand the problem. What is going on with this article?
@deaikei

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

More than 3 years have passed since last update.

動機

  • 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

23
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
23
Help us understand the problem. What is going on with this article?