Note of Pediatric Surgery

腸内細菌、R、ときどき小児外科

JMPファイルを何とかRに取り込もうとする…も撃沈する

0. はじめに

少し前から大学病院でJMP ( ジャンプ ) という統計ソフトの包括ライセンス契約を結んでいるらしく、JMPを使って解析をしたという話をよく聞くようになった。どうやら初学者にも使いやすくて好評らしい。聞いたことなかったので、なんだその怪しいソフトは、と内心バカにしていたのだが ( スミマセン ) どうやら泣く子も黙るSASの別バージョン ( ? ) らしい。

先日、共同研究先の先生から、jmpファイルで被験者情報のファイルをいただいたのだが、手元にRしか存在しないため上手く読み込めなくて悪戦苦闘してしまった。Excelに変換してもらう、というオチになってしまったが、その奮闘記を何かの役に立てればと思い書いてみる。

1. なぜExcelに変換してはいけないのか?

誰もが思うExcelにexportしてもらえばいいじゃん、ということ。当然僕も思いましたし、最終的にここに落ち着いてしまいましたが、

  • カテゴリー変数のラベル情報が消去されてしまう

という致命的な問題があるようです。

2. JMPファイルをRで読み込むのは難しい

ネットで.jmpからRに取り込む手段を検索するもなかなかヒットしない。

JMP®による解析アプリケーションの開発

どうやらRとJMPを同じマシンにインストールしておけばいろいろと連携させることができるようです。しかしそんなことがしたいわけではない。困ったのでFacebookのRのグループのメンバーにお伺いを立ててみた。すると、JMPでSASのファイルに変換すれば上手く読み込めるという情報をいただいた。コチラにも同様の情報がある。その名も、SAS移送ファイルで拡張子は.xpt。

3. .sas7bdat

3-1. {sas7bdat}を試してみる

というわけで、.xptに変換してもらうように先方に依頼したところ、.sas7bdatという形式で送られてきた。明らかにこれもSASのファイルなので、Rで開けるだろうと判断していろいろと調べてみるとRのPackage ‘sas7bdat’で開けることがわかった。

install.packages("sas7bdat")
library("sas7bdat")
Data <- read.sas7bdat("export.sas7bdat",debug=FALSE)

と入力すると

Error in read.sas7bdat("export.sas7bdat", debug = FALSE) : 
  magic number mismatch please report bugs to maintainer

と返ってくる。エラーメッセージをgoogleにかけても有効な情報は得られない。辿り着いたコチラのサイトによると、どうやら原因は2つあるようだ。

SAS側でのデータ作成について
ASデータセットを作るときに圧縮をかけるのが通常なのですが、
Rに取り込むときに圧縮をかけていると、
読み込みがエラーになるので注意が必要です。

SASにて、データを取り込むときに「compress = no」とオプションをつける!

データの確認 日本語の変数要素が入っている場合は 文字化けしている可能性があります。

先方にデータを圧縮したか尋ねたが明瞭な回答は得られず。日本語はそもそも入っているようで、英語にすべて変換するのは厳しいとのこと。というわけで{sas7bdat}を使うのは諦めた。

3-2. {haven}を試してみる

次にたどり着いたのは、Package ‘haven’。これも試してみると

install.packages("haven")
library(haven)
read_sas("export.sas7bdat")

すると

read_sas("export.sas7bdat")
Error: Failed to parse export.sas7bdat: Invalid file, or file has unsupported features.

と怒られた。するとhavenの最新バージョンならイケるという情報をゲットしたので試してみる。Githubからダウンロードするらしい。

devtools::install_github("hadley/haven")
library(haven)
read_sas("export.sas7bdat")

インストールに時間がかかり、これはイケるかも?と期待されたが

read_sas("export.sas7bdat")
Error: Failed to parse export.sas7bdat: Invalid file, or file has unsupported features.

とあえなく撃沈。

3-3. sas7bdat.parso

今度はコチラのサイトを見つけました。ここで紹介されているsas7pdat.parsoという物を使えば、compressされたSASファイルも扱えそう。というわけでやってみました。

install.packages(c("rJava", "devtools"))
devtools::install_github("BioStatMatt/sas7bdat.parso")
library(sas7bdat.parso)
read.sas7bdat.parso("export.sas7bdat")

とすると今度は

Error in .jnew("s7b2csvclass") : 
  java.lang.UnsupportedClassVersionError: s7b2csvclass : Unsupported major.minor version 51.0

という新しいエラーメッセージが。割りとメジャーなものでどうやらJAVAの設定の問題の様子。Githubの皆様は、みんな困っていたようですが、解決策が出ず。他にもいろいろとgoogleでヒットするのですが、僕の理解の範疇を超えてしまっています。コチラを参考に.bash_profileをいじったりしましたが、結局解決せず。この問題さえ解決できれば、クリアできそうだったのに…残念です。

3. .xpt

というわけで、.sas7bdatのインポートは諦めて、改めて.xptで送ってもらうように頼みました。.xptであれば割りと有名なpackage ‘foreign’でインポートできるようです。

install.packages("foreign")
library("foreign")
mydata <- read.xport("export.xpt")

とすると、ついに読み込めました!感極まりましたが、結局、

head(mydata)[,1:6]

とデータを確認すると

> head(mydata)[,1:6]
  X_R______ X____ X___A X________ X_E______ X_E_____R
1      C001     2     1         1         0        NA
2      C002     1     1         2         0        NA
3      C003     1     1         3         0        NA
4      C004     1     1         4         0        NA
5      C005    NA     1         5        -1        NA
6      C006     1     1         6         0        NA

となり、日本語で書かれた列名が文字化けし、ラベルの項目は結局削除されてしまっていましたとさ。
というわけで、長くなりましたが、結局はExcelに単純に変換してもらったファイルを何とかラベルを類推して解析しました。恐らくsas7bdat.parsoでJAVAの問題さえ解決できればなんとかなったんじゃないかと思われます。
どなたか、詳しい方、教えていただけると幸いです。