Rでちゃんとしたクロス集計表を出力する関数
Rで困ることはもうほとんどないのですが,唯一致命的なのが,まともなクロス集計表を出力する関数がないことです。論文で標準的な形式の,周辺度数込みで度数と行パーセントを並べているだけのものでいいんですが,tableやらprop.tableやらaddmarginsやらを駆使してもなかなか思い通りのものが作れない。gmodelsとかのCrossTable関数は悪くはないんですが,返り値がtableじゃない,オプションをいっぱい指定しないと好みのものができない,3重クロス表に非対応,など不満点はけっこう多いです。
パッケージでいい関数が作られてないか,数年間探し続けてたんですが,ラチがあかないので作りました。
使い方は簡単です。
> # 擬似データ作成
> 性別 <- factor(rbinom(1:1000, 1, 0.5), labels=c("男性", "女性"))
> 年齢 <- factor(rbinom(1:1000, 2, 0.4), labels=c("若年層", "中年層", "高年層"))
> 身長 <- factor(rbinom(1:1000, 2, 0.6), labels=c("低", "中", "高"))
>
> # CrossTableオブジェクト作成用関数。使い方もオプションもtable関数とまったく同じ。
> t1 <- crossTable(性別, 年齢, 身長)
>
> # クロス集計表出力
> summary(t1)
===================================================
身長
---------------------
低 中 高 Total
---------------------------------------------------
性別 男性 年齢 若年層 41 99 68 208
19.7% 47.6% 32.7% 100%
中年層 29 116 85 230
12.6% 50.4% 37.0% 100%
高年層 13 47 32 92
14.1% 51.1% 34.8% 100%
-----------------------------------------
Total 83 262 185 530
15.7% 49.4% 34.9% 100%
----------------------------------------------
女性 年齢 若年層 22 75 62 159
13.8% 47.2% 39.0% 100%
中年層 33 111 89 233
14.2% 47.6% 38.2% 100%
高年層 8 35 35 78
10.3% 44.9% 44.9% 100%
-----------------------------------------
Total 63 221 186 470
13.4% 47.0% 39.6% 100%
===================================================
Chi-Square Test for Independence
性別 : 男性
Number of cases in table: 530
Number of factors: 2
Test for independence of all factors:
Chisq = 4.494, df = 4, p-value = 0.3432
性別 : 女性
Number of cases in table: 470
Number of factors: 2
Test for independence of all factors:
Chisq = 1.4735, df = 4, p-value = 0.8313
crossTable関数は使い方もオプションもtable関数とまったく同じです。crossTable関数はCrossTableオブジェクトを返しますが,CrossTableクラスはtableクラスを継承しているので,tableとまったく同じように使えます。summary関数に渡すと,クロス集計表と,独立性の検定の結果を出力します。クロス集計表の形式は完全に僕の好みに合わせているので,異論があれば言ってください。なにかオプションを付けるかもしれません。
これで,Rでもカテゴリ変数を心置きなく使えるようになりました。
semパッケージが激しく進化!version3になり超実用的に
semパッケージはオワコン。通はOpenMxかlavaanを使う。そう思っていた時期が私にもありました。
ところが,semパッケージがこの半年の間に2回もメジャーバージョンアップを行っており,凄まじい進化を遂げていました。こういう定番パッケージは大幅な更新はないものと思い込んでいましたが,恥ずかしい見当違いでした。
ざっとヘルプに目を通したところ,以下のようなすばらしい更新点があります。
- 待ち望まれていた多母集団同時解析に対応!
- CFA用のモデル記法の追加
- LISREL風のモデル記法の追加
- モデルの結合や更新の機能
- 誤差項を自動的に追加するオプション
- その他多数
以下,Osaka.R #4の発表資料に対応させる形で解説していきます。
LISREL風記法について
まず,LISREL風記法については,回帰式をそのまま書くような記法が使えるようになりました。
ものすごく簡潔でわかりやすいですね!説明の必要もあまりないくらいですが,左辺に従属変数,右辺にパラメータ名*独立変数の形で回帰式を書いていきます。分散(誤差項)はV(変数)=パラメータ名で表し,共分散はC(変数1, 変数2)=パラメータ名で表します。ちなみにこのときのVとCは大文字でも小文字でもかまいません。
モデルの更新
次に,モデルを更新してみましょう。前述の重回帰分析にパスを足して,パス解析にしてみます。
addはパスを追加する,という命令です。他にもパスを削除するdelete,変数やパラメータ名を置換するreplace,パスを固定するfix,パスを自由にするfreeがあります。ここで注意点として,追加したパラメータ名が元のモデルのパラメータ名と(意図せず)重複しないようにしなければなりません。パラメータ名を重複させた場合,それらのパスには等値制約を課すという意味になります。
モデルの結合
ちなみにupdateでは従来の記法しか使うことができませんが,ただパスを足すだけならば,モデルを結合するcombineModelsを使うことで簡潔な表現が可能になります。
さて,お気づきのとおり,上記のモデルでは教育年数と職業威信の誤差項を書いていません。endog.variancesにTRUEを指定すると,内生変数に誤差項が付いていない場合に自動的に誤差項を付けてくれるようになりました(初期値がTRUEなので実際には上記のようにわざわざ指定する必要はありません)。Mplusでは標準でそうなっているのですが,この機能があるのとないのとではモデル構築の効率が大きく変わってきます。
combineModelsは名前の通りの関数ですが,これもupdateと同じくパラメータ名の重複に注意が必要です。また,この関数はなぜか返り値がmatrixです。ただ,matrixのままでもsem関数に使うことはできます。とはいえ,結合したモデルにupdateを使う予定がある場合などは,ちょっと不便です。そこで,removeRedundantPaths関数を使うと,標準的なsemmodクラスに変換することができます。removeRedundantPaths関数の本来の機能は,名前の通り重複しているパスの削除なのですが,こういう使い方もできるようです。
ここまでLISREL風記法を中心に見てきましたが,注意しなければならないのは,この記法では,構造方程式(回帰の部分)は書けますが,測定方程式(因子分析の部分)は書けません。厳密には書けなくはないのですが,左辺は必ず従属変数かつ1変数でなければならないので,因子分析を表現するためには測定変数の数だけ式を書かなければなりません。
しかし,がっかりする必要はありません。強化されたsemパッケージには,CFA(検証的因子分析)用の記法も用意されています。
CFA用の記法
ものすごく簡潔ですね。reference.indicatorsはTRUEにすると,モデルの識別のために1つめの測定変数のパラメータを1に固定します。初期値はFALSEで,この場合は因子の分散を1に固定します。これだけだと因子間相関や誤差相関はどうすればいいんだ,という話になりますが,covsオプションに"変数1, 変数2"という形で共分散を指定することができます。c("変数1", "変数2")ではないことに注意してください。1つの文字列で1つの共分散を指定するので,複数の共分散を指定するときにc関数などを使ってベクトルで指定する,ということになります。ちなみにcovsオプションはcfa関数限定ではなく,specifyModelやspecifyEquationsでも使うことができます。
応用
ここまでのモデルを結合し,少し大きめのモデルを作ってみます。
多母集団の同時解析
最後に多母集団同時解析の解説です。
まずグループのカテゴリ数だけモデルを用意します。基本は同じで,同じパラメータ名の場合に等値制約が課せられます。いままでは1つのモデル内だけの話でしたが,多母集団同時解析なので,複数のモデル間でも等値制約が課せられることになります。
次に,multigroupModel関数で複数のモデルをひとまとめにします。groupsオプションは単にグループに名前を付けるだけで,サンプルを分割する変数のカテゴリ名に合わせる必要はありません。もっとも合わせない理由はほとんどないと思いますが,カテゴリの順番に気をつけてください。ちゃんと確かめていませんが,分析の出力はlevels関数の出力の順序で行われていると思います。
あとはsem関数を走らせるだけですが,データの渡し方に注意が必要です。共分散行列で渡す場合には,matrixのlistで渡します。生データを使う場合には,dataオプションにdata.framを指定し,formulaオプションに分析で使用する変数を指定します。groupオプションにはグループ分けに使う変数を文字列で指定します。
まとめ
さて,ここまで解説しつつ試した感じでは,いままで私が使ってきたソフトウェアやパッケージの中で,もっともモデルが書きやすかったです。その理由として考えられるのは,「構造方程式,測定方程式,共分散がそれぞれ別の書き方で書けること」なのではないかと思います。複雑なモデルを統一的な数式で表せるのがSEMのすばらしさなのですが,実際に分析するときにはそれが徒となって,モデルが複雑になるにつれどの式が何を表していたのかさっぱりわからなくなってきます。semパッケージの新機能では,因子は因子,回帰式は回帰式ではっきり書き分けることができ,また研究上大した意味を持たないことが多い(そのわりに分量が多い)共分散や誤差項も書き分けで隠蔽したり隔離したりできます。モデルの結合や更新も,SEMの鉄則である,小さなモデルを組み合わせて徐々に大きくしていく,という過程をそのままスクリプトで表現できるので,後から見ても非常に読みやすいように自然となります。
semパッケージは初学者の勉強用にはいいけど研究に使うには物足りないな,とずっと思っていたのですが,これならば万人にお勧めできます。足りないのは,混合効果とカテゴリカルな分析ぐらいでしょうか。そのあたりを必要とするのはかなりマニアックな人たちになってくるので,まあおとなしくMplusを使っておくべきでしょう。
これらの新機能の情報はウェブ等にはほとんどないのですが,ヘルプにはexampleが豊富に付いているので,あまり困ることはありませんでした。help(sem)とhelp(specifyModel)を一通り読んでexampleを走らせれば,だいたい理解できると思います。あとはhelp(package="sem")をざっと見て興味をひかれる関数のヘルプを読めば完璧です。進化したsemパッケージをぜひお試しください!
Rzパッケージ0.4-0リリース
バージョンアップしました。かなり多くの機能を追加したので,足りていない,と思っていた機能が増えているかもしれません。中心的な追加機能を以下に紹介します。
- プロットビューを大幅更新(実行・クリア・履歴ボタン,変数選択ドロップダウンボックス,ggplot2 0.9.0対応,その他多数)
- テーマの添付(kde42-oxygen)
- 変数ビューのレイアウトを変更
- 尺度の表示および変更方法を変更
- 変数の削除・複製機能
他にもたくさんありますが(特にプロットビュー周り),自分でもよくわからなくなってしまったので…。パッケージ添付のNEWSにもう少し詳しい更新情報があります。
プロットビューがどんな感じのものなのか,いまいち文章でうまく書けないので,動画を作りました。自分ではそこそこ高機能かつけっこう使いやすいと思っているのですが,いかがでしょうか?
インストール時の注意点として,ggplot2が0.9.0へのアップデートでR (≥ 2.14)を要求するようになりました。それにともない,Rzも ggplot2 (≥ 0.9)かつR (≥ 2.14)が必須となります。そのため,環境によっては,Rzインストールする前にRおよびggplot2のバージョンアップが必要な場合があります。
また,前バージョンから更新した場合には,今バージョンから同梱しているテーマは自動的には適用されません。設定から手動で変更してください。
さらに,更新とは直接関係はありませんがチュートリアルを移転しました。また,Gumroadでの寄付の受付を開始しました。 このパッケージがあなたの研究,仕事,趣味に役立ったのなら,それだけで十分うれしいのですが,寄付していただけるともっとうれしいです。 金額は自由に設定できます。 クレジットカードで簡単に寄付できます。 いただいた寄付は学費に充てさせていただきます。そういえば今月末に結婚式を挙げる予定なのですが,ご祝儀代わりに(ry
ぜひ感想をお聞かせください。
Rzパッケージ0.3-8リリース
Rzパッケージ更新しました。ラベル編集機能,キーボードショートカット,そしてクイックエディタが目玉です。



クイックエディタは複数変数の定型加工やでかいデータを探索的に分析するときには非常に強力です。詳しくはチュートリアル( http://m884.hateblo.jp/entry/2012/02/03/081945 )で。
ちなみに,バージョンアップ頻度が高すぎる,とCRANのメンテナに怒られたので,しばらくバージョンアップはありませんw どっちにしろ,自分が欲しかった機能はほぼ実装できたので,一段落です。
Rzパッケージ最新版 on CRAN Now!
大幅更新を行ったRzパッケージの最新版(0.3-6)が,CRANで公開されました。今のところ,まだ統数研CRANミラー(tokyo)にしかミラーリングされていませんが,今日明日中には筑波と兵庫にも行き渡ると思います(注:0.3-3というのが筑波と兵庫にミラーリングされていますが,これはバグがあって動かないバージョンです)。筑波と兵庫にも行き渡りました。
かなり気合いの入った更新でソースコード的にはあまり原型を留めていないので,どこが更新されたのか列挙するのは難しいのですが,チュートリアル(リンクがうまく貼れていません,チュートリアルは1つ前の記事です)を作成したのでこちらを見てもらえればだいたい機能は網羅しています。プロット周りはまだぜんぜん書けていませんが…。
一言(?)で言えばこんなこと↓ができるようになりました。
あと地味に大きいのが「data.setとして同期」という機能で,これによってコンソールとRzを自由に行き来できるようになりました。
Rzパッケージ・チュートリアル
移転しました。 http://m884.jp/Rz_Ja.html
* 更新履歴
Rzパッケージの更新履歴
- 2012-02-06 0.3-8 クイックエディタビュー,値ラベル編集機能,キーボードショートカット追加
- 2012-02-01 0.3-6 大幅更新
- 2011-04-04 0.2-1 初版
なお,開発版を次のリンクで公開しています(Windows用バイナリ,ソース)。CRANポリシーによりCRANへのアップロードは月に1回程度に制限されていますので,いち早く最新版を使いたい方はこちらをご利用ください(タイミングによってはCRANに上がっているものと同じバージョンかもしれません)。
このチュートリアルの更新履歴
- 2012-02-07 0.3-8対応
- 2012-02-02 0.3-6対応の初版
動作環境
主にWindowsとLinuxで動作確認をしています。Macは英語のみ,かつ公式GUI以外(ターミナル,ESS,RStudio)の環境で一応の動作確認ができています。公式GUIでは英数字であっても文字化けを起こします。その他の言語については確認できていませんが,少なくとも日本語は表示・入力ともにできません(おそらく中国語,朝鮮語も)。日本語のMacでも,Rを英語設定で立ち上げれば,公式GUI以外で使うことができます。ホームフォルダの.Renvironに LANGUAGE=En を書き足すと,Rを英語設定にすることができます。
また,バージョン2.12以降のRが必要です。バージョン2.12よりも古いRを使っている場合は,こちらから新しいバージョンをダウンロードしてインストールして下さい。
概要
GUIをRに
RzパッケージはSPSSと互換性を保ちつつそれを超えるようなデータ管理環境を目指して開発を行っています。
Rは非常に強力な統計解析環境ですが,グラフィカルユーザーインターフェース(GUI)に関してはいまのところ貧弱と言わざるをえません。GUIなど必要ない,慣れればスクリプトを書いた方が早い,という意見も多く,確かに多くの場面ではそれは真実なのですが,一方でGUIが優位性を持つ場面もやはり存在します。
Rzの主機能であるデータ管理も,そのうちの1つです。例えば社会調査データの場合,1つのデータセットが数十から数百を超える変数を持ちます。このぐらいの数の変数をコンソールで管理するのは,大変な煩わしさが伴います。全ての変数名を正確に覚えきるのは現実的ではありません。また,これだけ変数があると,ある変数がどのような変数だったか確かめるだけでも大変な労力です。短い変数名(あるいは”Q1”のような形式的な変数名)では内容が分かりませんし,かといって長い変数名をつけると分析の際に不便です。結局,対処としては変数情報を一覧できる他のソフト(ExcelやSPSS)をRと並行して立ち上げる,というような方法になってしまいます。
このような煩わしさを解消することが,Rzの開発目的の1つです。
memiscパッケージを取り込んだRzのデータ管理機能
Rzは,しかし,単なる変数閲覧パッケージではありません。Rzの本質は,memiscパッケージの機能の組み込みにあります。memiscパッケージは,変数ラベル,値ラベル,尺度の管理,ユーザー欠損値といった,SPSS等の持つデータ管理機能をRでも使えるようにする強力なパッケージです。つまり,memicのフロントエンドとしてのGUIを構築することで,SPSS等のグラフィカルな統計解析パッケージと同等以上の機能をRにもたらすのが,Rzパッケージです*1。SPSSはよくRと比較され,どちらがより優れているのか様々な意見が交わされていますが,もしSPSSのバックエンドが完全にRになったとしたら,それはすばらしいソフトだと思いませんか?
初心者向け?
Rzはこのような成り立ちのソフトであるため,GUIを提供するといっても,必ずしもRの初心者向けとして作られたわけではありません。例えば,SPSS等のような統計解析のインターフェースはありません。統計解析は,スクリプトを書いてコンソールベースで行った方が効率的だと考えるからです。つまり,コンソールが優位な場面ではコンソールを,GUIが優位な場面ではGUIを使う,というのがRzの設計思想です。
とはいえ,例えばSPSS等から乗り換える際に,Rzを使えばmemiscのSPSS互換機能によって多くの障害が取り除かれるのは確かですし,それも開発目的の1つではあります。しかし,それにとどまらず,むしろ中級者以上のRユーザーのデータ分析の効率を高めることが,Rzの主たる開発目的です。
このような目的であることから,Rzはクリックしていくだけでなんでもできるわけではなく,利用者はRの基本的な使い方を学んでおく必要があります。そしてその次のステップとしてmemiscパッケージの使い方を学ぶことで,柔軟かつ効率的にデータを管理し,分析により多くの力を注ぐことができるようになるでしょう。
memiscパッケージの使い方については,ビネットや,私が過去に作った資料(PDF)があります。また,Rパッケージガイドブックにより詳しい解説を書いています。
プロット機能
さらにRzは,実用的なプロット機能を搭載しています。Rでグラフを作成するとき,作りたいグラフは完璧に頭の中にあるのに,それがうまく作れずに頭を悩ませた経験はありませんか? Rのプロット機能は多彩で強力ですが,そのぶん複雑で,作成するグラフごとに異なる様々なオプションを把握するのは楽ではありません。
Rzはggplot2をバックエンドに使い,美しいグラフを簡単な操作で作成することを可能にしています。
インストール
Rzパッケージと,依存パッケージをインストールします。
install.packages("Rz")
依存パッケージとしてRGtk2パッケージがインストールされます。RGtk2パッケージは,別途GTK+をダウンロードする必要があります。以降,GTK+のダウンロード手順を説明します。
まず,RGtk2パッケージを読み込むと,以下のようなエラーが出ます。
> library(RGtk2) Error in inDL(x, as.logical(local), as.logical(now), ...) : 共有ライブラリ 'C:/home/masahiro/R_library/RGtk2/libs/i386/RGtk2.dll' を読み込めません: LoadLibrary failure: 指定されたモジュールが見つかりません。
さらに,ダイアログでGTK+のインストールを促されます。そのままOKを押し,GTK+をダウンロードして下さい。

ダウンロードが始まります。
URL 'http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip' を試しています Content type 'application/zip' length 24516284 bytes (23.4 Mb) 開かれた URL downloaded 23.4 Mb

ダウンロードが終了すると,以下のようなメッセージが出ますので,Rを再起動して下さい。
Learn more about GTK+ at http://www.gtk.org If the package still does not load, please ensure that GTK+ is installed and that it is on your PATH environment variable IN ANY CASE, RESTART R BEFORE TRYING TO LOAD THE PACKAGE AGAIN 警告メッセージ: Failed to load RGtk2 dynamic library, attempting to install it.
再起動後,以下のスクリプトを実行し,何もないウィンドウが出れば,インストールは完了です。
library(RGtk2) gtkWindowNew()

起動
インストール後,起動は以下のようにするだけです。
library(Rz) Rz()
または,メニューバーからも起動できます。

起動すると,以下のようなウィンドウが立ち上がります。

データの読み込み
作業環境からのデータの読み込み
「大局的環境からインポート」では,すでに作業環境にあるデータをRzに読み込むことができます。読み込めるデータは,data.frameかdata.setです。
試しに,irisを読み込んでみて下さい。まず,次のスクリプトを実行すると,組み込みデータのirisが大局的環境にロードされます。
data(iris)
メニューバーのファイルかツールバーの「大局的環境からインポート」を選び,ドロップダウンメニューからirisを選択してください。


コンソールで以下のスクリプトを実行すると,dataset1という名前の,irisと全く同じ中身のdata.frameができていることが分かります。これはRzに読み込んだirisが,dataset1という名前で大局的環境に出力されたものです。Rz上でのデータの変更は即座に大局的環境に反映されるので,Rz上でデータ管理を行い,出力されたデータを分析に用いる,というのがRzの基本的な使い方です。
> ls() [1] "dataset1" "iris" > summary(dataset1) Sepal.Length Sepal.Width Petal.Length Petal.Width Species Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50 Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50 Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800 Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500 > all.equal(iris, dataset1) [1] TRUE
ファイルからのデータの読み込み
メニューバーのファイルかツールバーの「開く」を選ぶと,ファイルからデータを読み込むことができます。

現在の対応形式は,独自形式のRz Dataファイル(*.rzd),SPSSシステムファイル(*.sav),SPSSポータブルファイル(*.por),Stataファイル(*.dta)コンマ区切りテキスト(*.csv),タブ区切りテキストです。

ファイルの文字コードがRの文字コードと異なる場合は,エンコーディングからファイルの文字コードを選択して下さい。
コンマ区切りテキスト,タブ区切りテキストを読み込むときは,ヘッダの有無(一行目が変数名かどうか),欠損値(NA)に割り当てている文字を設定して下さい。

大きなデータは読み込みに時間がかかります。また,文字コードを変換する場合は読み込みに数分かかる場合があります。

データの管理
Rzのデータ管理の基本
読み込んだデータは,ツールバーの下のドロップダウンリストで切り替えることができます。リスト内の左側がデータセット名,右側が読み込んだファイルの名前です。

Rzは大局的環境とは別の場所(パッケージの環境)で独自にデータを管理していることに注意して下さい。Rzの管理しているデータは,データセット名を変数名として,常に大局的環境と同期されますが,同期は基本的に一方向です。つまり,Rz上でのデータの編集は大局的環境に反映されますが,大局的環境でのデータの編集はRz上に反映されません。
大局的環境からリロード
大局的環境で加えた編集をRz上に反映させたい場合,2つの方法があります。1つめは,「大局的環境からリロード」を使う方法です。この機能は単純ですが,非常に強力です。非定型のデータ整形ならばRzで行い,定型のデータ整形ならばスクリプトによって一気に行ってからRzにリロードすることで,GUIとコンソールを効率的に使い分け,生産性を上げることができます。このようなGUIとコンソールの連携が,Rzの大きな特長の1つです。

この機能を使うためには,「memiscパッケージのdata.setとして同期」を有効にしておく必要があります。無効の場合,同期はdata.frameで行われます。data.frameは変数ラベルやユーザー欠損値などの情報を持たないため,Rz上のデータに反映させるとそれらの情報が欠落してしまいます。そのため,データを編集する際には,この設定を有効にしておくことを推奨します。
一方で,data.setは場合によっては分析に用いるのに適しません。data.setは透過的にdata.frameと同じように扱えるようになっていますが,やや処理が遅く,また関数によっては用いることができない場合があります。そのため,分析の際にはこの設定を無効にすることを推奨します。

2つめは,「大局的環境からインポート」を使って別データとして読み込む方法です。こちらはdata.setでもdata.frameでも読み込むことができますが,上記と同様の理由で,data.setから読み込むことを推奨します。
データの操作
変数が並んでいるシートを,変数ビューと呼びます。変数ビューの列は,左から順に,インデックス,変数名,変数ラベル,尺度,値ラベル,ユーザー欠損値です。
変数名は,data.frameの変数名と同じもので,変数にアクセスする際に使います。変数ラベルには,変数のより詳しい説明を記入することができます。
尺度は,nominal,ordinal,interval,ratioから選ぶことができます。分析に用いる際には,nominalはfactor,ordinalはorderd,intervalとratioはnumericに変換されます。
値ラベルは,変数の値にラベルをつけるものです。Rではfactorをカテゴリ変数,numericを量的変数として用いますが,factorにインデックスとして数値を割り当てたり,numericにラベルをつけたりすることはできません。Rzでは,SPSSやStataのようなラベル管理を可能にしています。
ユーザー欠損値は,変数の値を,情報を失わずに欠損値に指定する機能です。Rは通常いったんNAを割り当ててしまうと,元の値を復元することはできません。Rzでは,ユーザー欠損値の機能によって,値を柔軟に欠損値にしたり戻したりすることができます。
データの編集 New!
値ラベル以外は,行を一度選択してから,次に各セルをクリックすると編集できます。尺度は,行を選択後,尺度のセルをクリックし続けると,ドロップダウンリストが現われ,尺度を選択できます。連打するとフリーズするので気をつけて下さい。値ラベルを変更する場合は,変数を右クリックし,値ラベルの変更画面から変更してください。「+」の行に値とラベルを入力することで新しい値ラベルを追加することができ,「-」のセルをダブルクリックすることで値ラベルの削除ができます。

ユーザー欠損値の設定
ユーザー欠損値は,値指定と範囲指定の2種類の方法で設定することができます。
値指定は,ユーザー欠損値に指定したい数値をコンマで区切って入力します。
1, 2, 3, 4, 5
このように指定すれば,1と2と3と4と5がユーザー欠損値に指定されます。また,以下のように指定することもできます。
1:5
これは,1つめの指定方法と同じ結果になります。基本的に,c関数に渡したときに数値ベクトルが返り値となる記述であれば,入力することができます。よって,以下のように交ぜて入力することも可能です。
1:5, 9, 10, 12:15
範囲指定は,以下のように記述します。
range=c(5, 10)
この場合,5以上10以下の値がユーザー欠損値となります。値指定とちがい,6.4や9.8などの小数を含む,範囲内の全ての実数が欠損値となります。
Infを指定することで,無限大の範囲を設定することもできます。
range=c(5, Inf) range=c(-Inf, 3)
範囲指定は,1つの変数につき1つの範囲しか設定することができません。また,値指定と混在させることはできません。
リコード
変数の行で右クリックしてリコードを選択すると,リコードのダイアログが表示されます。

一番上がその変数に存在している値です。その下の左側が変数の値とラベルの対応関係です。ラベルは存在していない値にも付けることができ,反対に値は存在するがラベルはついていない場合があるので,この欄で確認して下さい。
ラベルの欄の右側は,一番上がいまリコードしている変数の名前,その下がリコード結果を保存する変数の名前です。リコード先にリコード元と同じ名前,またはデータセット中に存在する変数名を入力すると,上書きされます。データセット中に存在しない変数名を入力すると,新変数としてデータセットの最後尾に付け加えられます。その下が,変数に設定する変数ラベルです。
その下の「テンプレートの生成」ボタンを押すと,リコードのテンプレートが生成されます。このまま実行すると,全く同じ変数が生成されます。これを書き換えてリコードすることで,素早いリコードが可能です。下の画像が実例です。

この例では,1は1のまま,2と3を2に統合して「中」というラベルを付ける,4と5を3に統合して「下」というラベルを付ける,その他の値はそのまま,となっています。
otherwiseはこの例では意味がありませんが,リコードを指定していない「その他の値」についての処理を記述します。例えば一行目の1の値については,otherwise="copy"を指定しているので,今回の場合消してしまっても同じ結果になります。otherwise=NAにすれば「その他の値」は欠損値になりますし,otherwise=3とすれば「その他の値」はすべて3になります。
量的変数をカテゴリ変数にリコードしたい場合,range記法が便利です。
"低"=1 <- range(min , 40), "中"=2 <- range(40.01, 60), "高"=3 <- range(60.01, max)
このように書くと,最小値から40までが1でラベル「低」,40.01から60までが2でラベル「中」,60.01から最大値までが3でラベル「高」というふうにリコードされます。値を重複させるとエラーになるので気をつけてください。
基本的な書き方はmemiscパッケージのrecode関数と同じです。詳細はhelp(recode)を参照してください。
クイックエディタビュー(クイックエディタ) New!
クイックエディタビューを開くと,以下の画像のような画面が現れます。

上半分には変数ビューでチェックされた変数が一覧されており,下半分が簡易エディタになっています。試しに,irisデータのSepal.Length〜Petal.Widthの4変数にチェックを入れ,エディタに,
print(summary(df.orig)) cor(df)
と入力して「実行」ボタンを押すかキーボードでControl+Rを押してみてください。

コンソールに,下の画像のような出力がされます。

クイックエディタでは,もとのデータにdf.origという名前で,選択した変数のみに変数をしぼったデータ(今回でいえばiris[1:4]というデータ)にdfという名前でアクセスすることができます。クイックエディタを使えば,定型の出力を変数を入れ替えながら探索的に見る,というような作業の効率が大幅にアップします。
注意点として,クイックエディタで得られる出力は基本的に最後の関数の出力のみです。それ以外の出力を得たい場合は,能動的にprint関数などを使う必要があります。また,関数の戻り値を保存したい場合は,「<-」の代わりに「<<-」という代入記号を使えば,大局的環境に戻り値を保存することができます。
クイックエディタビュー(クイック変数エディタ) New!
クイックエディタビューのもう1つの機能,クイック変数エディタでは,チェックした変数に定型の加工を施し,データに反映させることができます。
変数の加工について,いくつかのテンプレートも用意してあります。まずは,クイックエディタのときと同じように4変数にチェックを入れ,テンプレートから「尺度を変更する」を選んでみてください。エディタに,
measurement(var) <- "ratio"
と入力されます。「実行」ボタンを押すかキーボードでControl+Rを押してみてください。

変数ビューを見ると,チェックを入れた4変数の尺度が「ratio」に変わっているはずです。
クイック変数エディタの仕組みは単純で,チェックされた変数は順番にvarという変数に代入され,処理を加えられたのちに元の変数に上書きされる,というものです。この処理にはmemiscパッケージのforeachという関数を使っています。
クイック変数エディタの注意点として,memiscの関数を使わない処理では多くの場合,変数ラベル・値ラベル・ユーザー欠損値などの情報が欠落してしまいます。やや面倒ですが,例えば下の画像のように処理を加える前にいったん変数ラベルなどを変数に保存しておくことで,欠落を防ぐことができます。

データの閲覧
行にカーソルを合わせると,変数のsummaryがポップアップします。行をダブルクリックすると,より詳しい要約がコンソールに表示されます。これはmemiscパッケージのcodebookという関数を使っています。

ポップアップは設定で無効にすることもできます。
データビュー
データビューを選択すると,生データを見ることができます。今のところ,見ることしかできません。

データの保存
「別名で保存」を選択すると,データを保存することができます。

独自形式の「Rz Dataファイル」で保存すると,全ての情報を保ったまま保存し,再度読み込むことができます。「SPSSシンタックスとCSV」で保存すると,CSVと,CSVを読み込むためのSPSSシンタックスが出力されます。「Stata DoファイルとCSV」で保存すると,CSVと,CSVを読み込むためのDoファイルが出力されます。「Stataファイル」で保存すると,Stataのdta形式のファイルで保存されます。コンマ区切りテキスト,タブ区切りテキストで保存すると,それぞれコンマ区切り,タブ区切りのCSVで保存されます。ファイルを開くときと同様,ヘッダの有無(一行目が変数名かどうか),欠損値(NA)に割り当てる文字を設定して下さい。
プロットビュー
プロットビューでは,ggplot2パッケージを用いた柔軟で美麗なグラフを出力することができます。
プロットビューを有効にすると,ggplot2の様々なオプションを設定する領域が現れます。ggplot2の多くの機能の中から,主要なものを使いやすくまとめてあります。軸や凡例のラベルには,データセット内の変数の変数名や変数ラベルを簡単に設定することができます。変数名を入力する際には,オートコンプリ−ションが働き,入力ミスを防ぎつつ素早く変数名を入力することができます。

まずは,なにもオプションを設定せずに,変数のインデックスをダブルクリックしてみてください。カテゴリ変数であれば棒グラフ,量的変数であればヒストグラムが出力されます。プロットビューでは,変数のインデックスをダブルクリックすることでプロットを出力します。これは変数の詳しい要約をコンソールに出力するときと同じ操作です。
もし,プロットビューを開いているときには要約を出力してほしくないのであれば,設定を変えることができます。

プロットビューの使い方
プロットビューの機能のほとんどはggplot2に基づいていますが,ggplot2はとても高機能なパッケージであるため,その解説は Rzパッケージのチュートリアルの範囲を超えます。とはいえ,ggplot2の基本的な使い方さえ覚えれば,プロットビューを使うのはとても簡単です。逆に,とりあえずプロットビューをいじって感じをつかんでから,本格的にggplot2を勉強する,というのも有効だと思います。
ggplot2は,公式サイトが非常に充実しています。また,作者による書籍およびその訳書も販売されています(ただし,シュプリンガー・ジャパンの撤退にともない,訳書は現在品薄になっています。そのうち事業譲渡先の丸善から発売されると思いますが,いつになるか分からないので,書店で発見したときは迷わず買いましょう)。また,ウェブページ,ブログ記事,勉強会の資料などもとてもたくさんあるので,検索してみてください。
例えば下の画像のような美しいグラフを,変数の指定とマウスクリックだけで出力することができます。

プロットビューでは,出力した画像を簡単に保存することができます。また,保存のフォーマットも豊富です。

その他の設定
テーマセレクタ
好みのテーマをダウンロードし,適用することができます。まず,テーマを入れるフォルダを好きなところに作り,設定画面でテーマフォルダを設定して下さい。次に,Gtk+2テーマをダウンロードしてきます。テーマはGNOME-LOOK.ORGからダウンロードできます。Gtk+3テーマとして配布されているものの中にも,Gtk+2テーマを含んでいるものがあります。ダウンロードしたテーマを,以下のような階層になるように,テーマフォルダに格納します。
"テーマフォルダ/テーマ名のフォルダ/gtk-2.0/gtkrc"
再び設定画面を開くと,テーマを選択できるようになっています。テーマの変更は,R本体を再起動するまで適用されません。
注意点として,pixmap以外のテーマエンジンを使っているテーマは,ほとんどが正しく表示されません。問題なく表示されるテーマをいくつかピックアップしたので,参考にして下さい。
![]() Aero-clone |
![]() Azel |
![]() Candido |
![]() Detour E17-GTK2 |
![]() ElegantBrit gtk3 |
![]() kde4.2-oxygen (modified) |
![]() Mac4Lin |
![]() MacOS-X Aqua Theme |
![]() Orta |
![]() SlicknesS |
埋め込みグラフィックスデバイス
埋め込みグラフィックスデバイスを使うと,ウィンドウ内部にプロットを埋め込むことができます。ただし,Windowsでは一部プロットが正常に表示されません(facetが正しく描画されないことを確認しています)。おそらく埋め込みに使用しているcairoDeviceパッケージのバグだと思われます。
この設定の変更は,Rzをいったん閉じ,再度Rz()を実行するまで反映されません。

フォントの設定
Rzでは画面表示やプロットに用いるフォントを指定することができます。特にプロットのフォント指定は通常は煩雑な手続きが必要ですので,利便性を大きく高める機能の1つだといえるでしょう。PDFのフォントとPostScriptのフォントについては,プロットをそれぞれの形式で保存するときにのみ用いられます。

今後の予定
順不同です。優先順位が高くないものも含まれています。要望をいただければ優先順位を上げます。
- ログ機能
- スクリプトでRzを操作できるようにする
- ラベル等をファイルから読み込み
- 簡易レポート作成機能
- plot履歴
- エラーバーなどの実装
- 変数の計算
- ポップアップ改善
- 変数にタグ
- クロス集計表
- ワーディング管理
- ケースの選択
- 最近使ったファイル
情報求む!
バグ報告・要望・質問・感想・批判等
全て大歓迎です。機能追加の要望があれば,内容によりますが可能なかぎり優先的に実装します。
twitter(@phosphor_m)かメール(rinm884@gmail.com)かコメントでよろしくお願いします。
*1:実際,Rzパッケージの開発初期はmemiscGUIという名前でした。
utilsパッケージより小ネタ集(R Advent Calendar 2011 7日目)
alarm
ではみなさん,おもむろに下のスクリプトを実行してください。
alarm()
音が出ましたね。それだけです。
R Advent Calendar 2011のレベルが高すぎて泣きそうです。でも開き直って,しょーもない小ネタでお茶を濁したいと思います!
ということで,utilsパッケージをざーっと眺めて,目に付いたものを紹介していきたいと思います。
ちなみにさきほどのalarm関数ですが,関数を使わなくとも,文字列で実現できます。alarmの中身を見れば分かりますが,
cat("\a")
これだけで音が出ます。これをcolnamesとかに仕込んでいたずらを…と思ったんですがうまくいきませんでした。
apropos
知ってる人が多いと思いますが。aproposはオブジェクトを検索する関数です。うろ覚えの関数を探すのに便利です。
apropos("sum")
いろいろ合計する関数がありますね。summaryも交ざっちゃってますが。よくわからない変数なんかも交ざってきますが,modeを指定することで,関数限定で検索することもできます。
apropos("sum", mode="function")
個人的には,適当に名前の当たりをつけて,こんな関数ないかなーっていうのを探すことも多いです。
例えばtestで検索すると,いろんな検定用関数が出てきます。
apropos("test", mode="function")
文字列を操作したいけどなんか良い関数あったっけ?ってときは下のような検索をしたり。
apropos("char", mode="function") apropos("str", mode="function")
browseVignettes
browseVignettes関数を実行すると,インストール済みパッケージのvignette一覧をブラウザで見ることができます。
browseVignettes()
vignetteは重要な情報源なのですが,積極的に探さないかぎり行き当たらないのが難点です。いつのまにか改訂されてたり,追加されてたりしますし。
暇なときにでもbrowseVignettesを使って,変化がないか見てみましょう。
citation
citation関数は,R本体やパッケージを引用したいときに,そのひな形を出力してくれます。
> citation() To cite R in publications use: R Development Core Team (2011). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org/. A BibTeX entry for LaTeX users is @Manual{, title = {R: A Language and Environment for Statistical Computing}, author = {{R Development Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2011}, note = {{ISBN} 3-900051-07-0}, url = {http://www.R-project.org/}, } We have invested a lot of time and effort in creating R, please cite it when using it for data analysis. See also ‘citation("pkgname")’ for citing R packages.
bibtex形式のものも出力してくれるのが親切ですね。
引数にパッケージ名を与えれば,パッケージの引用フォーマットを出力してくれます。
> citation("survival") To cite package ‘survival’ in publications use: Terry Therneau and original Splus->R port by Thomas Lumley (2011). survival: Survival analysis, including penalised likelihood.. R package version 2.36-10. http://CRAN.R-project.org/package=survival A BibTeX entry for LaTeX users is @Manual{, title = {survival: Survival analysis, including penalised likelihood.}, author = {Terry Therneau and original Splus->R port by Thomas Lumley}, year = {2011}, note = {R package version 2.36-10}, url = {http://CRAN.R-project.org/package=survival}, } ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and may need manual editing, see ‘help("citation")’ .
これらの情報は基本的にはパッケージのdescriptionからの自動生成なのですが,パッケージにCITATIONファイルが用意されている場合,そちらが表示されます(オプションでどちらを表示するか指定もできます)。
> citation("VGAM") To cite VGAM in publications please use: Thomas W. Yee and C. J. Wild (1996). Vector Generalized Additive Models. Journal of Royal Statistical Society, Series B, 58(3), 481-493. and/or Thomas W. Yee (2010). The VGAM Package for Categorical Data Analysis. Journal of Statistical Software, 32(10), 1-34. URL http://www.jstatsoft.org/v32/i10/. and/or Thomas W. Yee (2011). VGAM: Vector Generalized Linear and Additive Models. R package version 0.8-4. URL http://CRAN.R-project.org/package=VGAM
CITATIONファイルが用意されている場合,そこに記載されている論文や書籍は確実にパッケージの重要な情報源ですので,要チェックです。
create.post
create.post関数は,メールを作成します。
送信してくれるわけではなく,実行するとメーラーが起動します。
create.post(instructions="メール本文", subject="Rでメール", address="test@example.com", info="重要!")
ほとんど説明の必要がないですが,infoに指定した文字列は,"--please do not edit the information below--"という文のあとに書き込まれます。
使い途あるようなないような関数ですね(笑)
formatUL, formatOL
ベクトルを箇条書き形式に整形してくれます。ULは順序なしの箇条書き(Unordered List),OLは順序ありの箇条書き(Ordered List)です。
> cat(formatUL(1:10), sep="\n") * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 > cat(formatUL(1:10, label="†"), sep="\n") † 1 † 2 † 3 † 4 † 5 † 6 † 7 † 8 † 9 † 10
文字列ベクトルで返ってくるので,catで出力しています。ラベルオプションで頭の記号を変えられます。formatOLも使い方は同じです。
cat(formatOL(1:10), sep="\n") cat(formatOL(1:10, type="a"), sep="\n") # アルファベット cat(formatOL(1:10, type="A"), sep="\n") cat(formatOL(1:10, type="i"), sep="\n") # ローマ数字 cat(formatOL(1:10, type="I"), sep="\n")
使いどころを選びますが,知ってると便利な場面もあるかもしれないですね。
recover
これは直接実行する関数ではなく,オプションに設定します。
options(error = recover)
このように設定すると,エラーが起きたときに,エラーが起きた環境に遡って変数などを見ることができます。
デバッグのためにbrowser()を仕込むのは常套手段ですが,エラーが起きた箇所に自動的に遡ってbrowser()を仕込んでくれる感じです。超便利ですね。
終わり
以上,小ネタ集でした!











