今日読んだ本、アート・オブ・Rプログラミングの感想。
Rは統計分野では標準ツールして使われている人気の高いオープンソースソフトウェアです。統計分野のみならず、金融、数学、物理、化学、天文、バイオ、薬学等の幅広い分野での利用をサポートする豊富なパッケージ群が用意されており、多くのユーザからの支持を集めています。本書はRの強力かつ柔軟なプログラミング能力に焦点を当て、Rスクリプトを書く上でのテクニック、コツ、注意点をわかりやすく解説します。また、他言語との連携、並列R、デバッグ、コードの高速化など他のR書籍にはなかった情報も提供します。プログラミング言語としてRを活用し、その威力を最大限発揮させる上で必携の一冊です。
目次
-
謝辞
はじめに
- 1章 Rを始める
- 1.1 Rの実行方法
- 1.1.1 対話モード
- 1.1.2 バッチモード
- 1.2 最初のRセッション
- 1.3 関数の概要
- 1.3.1 変数のスコープ
- 1.3.2 デフォルト引数
- 1.4 重要なRデータ構造の概説
- 1.4.1 ベクトル:Rの主力
- 1.4.2 文字列
- 1.4.3 行列
- 1.4.4 リスト
- 1.4.5 データフレーム
- 1.4.6 クラス
- 1.5 応用例:試験の成績の回帰分析
- 1.6 起動と終了
- 1.7 ヘルプ
- 1.7.1 help()関数
- 1.7.2 example()関数
- 1.7.3 探しているものが正確にはわからない場合
- 1.7.4 その他のトピックのヘルプ
- 1.7.5 バッチモードのヘルプ
- 1.7.6 インターネット上のヘルプ
- 2.1 スカラ、ベクトル、配列、行列
- 2.1.1 ベクトル要素の追加と削除
- 2.1.2 ベクトルの長さの取得
- 2.1.3 ベクトルとしての行列と配列
- 2.2 宣言
- 2.3 リサイクル
- 2.4 一般的なベクトル操作
- 2.4.1 ベクトルの算術演算と論理演算
- 2.4.2 ベクトルのインデックス付け
- 2.4.3 :演算子を使った便利なベクトルの作成
- 2.4.4 seq()を使ったベクトルシーケンスの作成
- 2.4.5 rep()を使ったベクトル定数の繰り返し
- 2.5 all()とany()の使用
- 2.5.1 応用例:連続値を見つける
- 2.5.2 応用例:離散値時系列の予測
- 2.6 ベクトル化された演算
- 2.6.1 ベクトルを入力し、ベクトルを出力する
- 2.6.2 ベクトルを入力し、行列を出力する
- 2.7 NA値とNULL値
- 2.7.1 NAの使用
- 2.7.2 NULLの使用
- 2.8 フィルタリング
- 2.8.1 フィルタリンクインデックスの作成
- 2.8.2 subset()関数を使ったフィルタリング
- 2.8.3 選択関数which()
- 2.9 ベクトル化されたif-then-else:ifelse()関数
- 2.9.1 応用例:関係の尺度
- 2.9.2 応用例:アワビデータセットの再符号化
- 2.10 ベクトル等価性の検査
- 2.11 ベクトル要素名
- 2.12 c()に関する詳細
- 3.1 行列の作成
- 3.2 一般的な行列操作
- 3.2.1 行列での線形代数演算の実行
- 3.2.2 行列のインデックス付け
- 3.2.3 応用例:画像操作
- 3.2.4 行列のフィルタリング
- 3.2.5 応用例:共分散行列の作成
- 3.3 行列の行と列への関数の適用
- 3.3.1 apply()関数の使用
- 3.3.2 応用例:外れ値の検出
- 3.4 行列の行と列の追加と削除
- 3.4.1 行列のサイズ変更
- 3.4.2 応用例:グラフの頂点が最も近いペアを見つける
- 3.5 ベクトルと行列の違いに関する詳細
- 3.6 予期せぬ次元削減の回避
- 3.7 行列の行と列の名前付け
- 3.8 高次元配列
- 4.1 リストの作成
- 4.2 一般的なリスト操作
- 4.2.1 リストのインデックス付け
- 4.2.2 リスト要素の追加と削除
- 4.2.3 リストサイズの取得
- 4.2.4 応用例:テキスト索引
- 4.3 リストの成分と値へのアクセス
- 4.4 リストへの関数の適用
- 4.4.1 lapply()関数とsapply()関数の使用
- 4.4.2 応用例:テキスト索引(続き)
- 4.4.3 応用例:再びアワビデータ
- 4.5 再帰的リスト
- 5.1 データフレームの作成
- 5.1.1 データフレームへのアクセス
- 5.1.2 応用例:試験の成績の回帰分析(続き)
- 5.2 その他の行列的な操作
- 5.2.1 サブデータフレームの抽出
- 5.2.2 NA値の扱いに関する詳細
- 5.2.3 rbind()関数とcbind()関数の使用とその代替手段
- 5.2.4 apply()の適用
- 5.2.5 応用例:給与調査
- 5.3 データフレームのマージ
- 5.3.1 応用例:従業員データベース
- 5.4 データフレームへの関数の適用
- 5.4.1 データフレームでのlapply()とsapply()の使用
- 5.4.2 応用例:ロジスティック回帰モデルの適用
- 5.4.3 応用例:中国語方言学習の支援
- 6.1 ファクタと水準
- 6.2 ファクタで使う一般的関数
- 6.2.1 tapply()関数
- 6.2.2 split()関数
- 6.2.3 by()関数
- 6.3 表の扱い
- 6.3.1 表に対する行列/配列的な操作
- 6.3.2 応用例:部分表の抽出
- 6.3.3 応用例:表内の最大セルの検出
- 6.4 ファクタ/表関連のその他の関数
- 6.4.1 aggregate()関数
- 6.4.2 cut()関数
- 7.1 制御文
- 7.1.1 ループ
- 7.1.2 一連の非ベクトルに対するループ
- 7.1.3 if-else
- 7.2 算術演算子とブール演算子およびその値
- 7.3 引数のデフォルト値
- 7.4 戻り値
- 7.4.1 明示的にreturn()を呼び出すかどうかの判断
- 7.4.2 複雑なオブジェクトを返す
- 7.5 関数はオブジェクト
- 7.6 環境とスコープの問題
- 7.6.1 トップレベル環境
- 7.6.2 スコープ階層
- 7.6.3 ls()に関する詳細
- 7.6.4 関数には(ほとんど)副作用はない
- 7.6.5 応用例:呼び出しフレームの内容を表示する関数
- 7.7 Rにはポインタがない
- 7.8 上位レベルへの書き込み
- 7.8.1 スーパーアサインメント演算子を使った非ローカルへの書き込み
- 7.8.2 assign()を使った非ローカルへの書き込み
- 7.8.3 応用例:Rでの離散事象シミュレーション
- 7.8.4 グローバル変数はどのようなときに使うべきか
- 7.8.5 クロージャ
- 7.9 再帰
- 7.9.1 クイックソートの実装
- 7.9.2 応用例:二分探索木
- 7.10 置換関数
- 7.10.1 置換関数とみなす場合
- 7.10.2 応用例:自己記録ベクトルクラス
- 7.11 関数コードを作成するためのツール
- 7.11.1 テキストエディタと統合開発環境
- 7.11.2 edit()関数
- 7.12 独自の二項演算の記述
- 7.13 匿名関数
- 8.1 数学関数
- 8.1.1 応用例:確率の計算
- 8.1.2 累積合計と累積積
- 8.1.3 最小値と最大値
- 8.1.4 微積分
- 8.2 統計分布のための関数
- 8.3 ソート
- 8.4 ベクトルや行列に対する線形代数演算
- 8.4.1 応用例:ベクトル外積
- 8.4.2 応用例:マルコフ連鎖の定常分布を求める
- 8.5 集合演算
- 8.6 Rでのシミュレーションプログラミング
- 8.6.1 組み込み乱数ジェネレータ
- 8.6.2 繰り返し実行するたびに同じ乱数列を取得する
- 8.6.3 応用例:組合せシミュレーション
- 9.1 S3クラス
- 9.1.1 S3ジェネリック関数
- 9.1.2 例:lm()線形モデル関数でのOOP
- 9.1.3 ジェネリックメソッドの実装を探す
- 9.1.4 S3クラスの記述
- 9.1.5 継承の利用
- 9.1.6 応用例:上三角行列を格納するためのクラス
- 9.1.7 応用例:多項式回帰の方法
- 9.2 S4クラス
- 9.2.1 S4クラスの記述
- 9.2.2 S4クラスでのジェネリック関数の実装
- 9.3 S3とS4の対比
- 9.4 オブジェクトの管理
- 9.4.1 ls()関数を使ったオブジェクトの列挙
- 9.4.2 rm()関数を使った特定のオブジェクトの削除
- 9.4.3 save()関数を使った一連のオブジェクトの保存
- 9.4.4 構造を知る
- 9.4.5 exists()関数
- 10.1 キーボードとモニタへのアクセス
- 10.1.1 scan()関数の使用
- 10.1.2 readline()の使用
- 10.1.3 画面への出力
- 10.2 ファイルの読み書き
- 10.2.1 ファイルからのデータフレームや行列の読み込み
- 10.2.2 テキストファイルの読み込み
- 10.2.3 コネクションの概要
- 10.2.4 応用例:PUMS国勢調査ファイルの読み込み
- 10.2.5 URLを使ったリモートマシン上のファイルへのアクセス
- 10.2.6 ファイルへの書き込み
- 10.2.7 ファイルとディレクトリの情報の取得
- 10.2.8 応用例:複数ファイルの内容の合計
- 10.3 インターネットへのアクセス
- 10.3.1 TCP/IPの概要
- 10.3.2 Rでのソケット
- 10.3.3 :並列Rの実装
- 11.1 文字列操作関数の概要
- 11.1.1 grep()
- 11.1.2 nchar()
- 11.1.3 paste()
- 11.1.4 sprintf()
- 11.1.5 substr()、substring()
- 11.1.6 strsplit()
- 11.1.7 regexpr()
- 11.1.8 gregexpr()
- 11.2 正規表現
- 11.2.1 応用例:ファイル名が特定の拡張子を持つかどうかの検査
- 11.2.2 応用例:ファイル名の作成
- 11.3 edtdbgデバッグツールでの文字列ユーティリティの使用
- 12.1 グラフの作成
- 12.1.1 Rの基本グラフィックスの立役者:plot()関数
- 12.1.2 線の追加:abline()関数
- 12.1.3 古いグラフを保持したまま新しいグラフを開始する
- 12.1.4 応用例:同じグラフ上の2つの密度推定
- 12.1.5 応用例:多項式回帰例の拡張
- 12.1.6 点の追加:points()関数
- 12.1.7 凡例の追加:legend()関数
- 12.1.8 テキストの追加:text()関数
- 12.1.9 位置の正確な特定:locator()関数
- 12.1.10 プロットの復元
- 12.2 グラフのカスタマイズ
- 12.2.1 文字サイズの変更:cexオプション
- 12.2.2 軸の範囲の変更:xlimオプションとylimオプション
- 12.2.3 多角形の追加:polygon()関数
- 12.2.4 点の平滑化:lowess()関数とloess()関数
- 12.2.5 陽関数のグラフ化
- 12.2.6 応用例:曲線の一部を拡大する
- 12.3 グラフのファイルへの保存
- 12.3.1 Rグラフィックデバイス
- 12.3.2 表示されたグラフの保存
- 12.3.3 Rグラフィックデバイスのクローズ
- 12.4 3次元プロットの作成
- 13.1 デバッグの基本原則
- 13.1.1 デバッグの神髄:確認の原則
- 13.1.2 小さく始める
- 13.1.3 モジュール式のトップダウンでのデバッグ
- 13.1.4 アンチデバッグ
- 13.2 デバッグツールを使う理由
- 13.3 Rのデバッグ機能の利用
- 13.3.1 debug()関数とbrowser()関数を使ったシングルステップ実行
- 13.3.2 ブラウザコマンドの使用
- 13.3.3 ブレークポイントの設定
- 13.3.4 trace()関数を使った追跡
- 13.3.5 traceback()関数とdebugger()関数を使ったクラッシュ後の検査の実行
- 13.3.6 応用例:2つの完全なデバッグセッション
- 13.4 上級編:さらに便利なデバッグツール
- 13.5 シミュレーションコードのデバッグ時の整合性の確保
- 13.6 構文エラーと実行時エラー
- 13.7 GDBでのR自体の実行
- 14.1 高速なRコードの記述
- 14.2 ループに対する恐れ
- 14.2.1 高速化のためのベクトル化
- 14.2.2 応用例:モンテカルロシミュレーションを使った高速化
- 14.2.3 応用例:累乗行列の作成
- 14.3 関数型プログラミングとメモリに関する問題
- 14.3.1 ベクトル割り当ての問題
- 14.3.2 変更時コピーの問題
- 14.3.3 応用例:メモリコピーの回避
- 14.4 Rprof()を使ったコードの遅い箇所の検出
- 14.4.1 Rprof()を使ったモニタリング
- 14.4.2 Rprof()の動作方法
- 14.5 バイトコードコンパイル
- 14.6 データがメモリに収まらない
- 14.6.1 チャンキング
- 14.6.2 メモリ管理のためのRパッケージの使用
- 15.1 Rから呼び出すC/C++関数の記述
- 15.1.1 RからC/C++への下準備
- 15.1.2 例:正方行列からの下対角要素の抽出
- 15.1.3 コードのコンパイルと実行
- 15.1.4 R/Cコードのデバッグ
- 15.1.5 応用例:離散値時系列データの予測
- 15.2 PythonからのRの利用
- 15.2.1 RPyのインストール
- 15.2.2 RPy構文
- 16.1 相互アウトリンク問題
- 16.2 snowパッケージ
- 16.2.1 snowコードの実行
- 16.2.2 snowコードの分析
- 16.2.3 どの程度高速化できるか
- 16.2.4 応用例:k-mean法
- 16.3 Cの活用
- 16.3.1 マルチコアマシンの使用
- 16.3.2 応用例:OpenMPでの相互アウトリンク問題
- 16.3.3 OpenMPコードの実行
- 16.3.4 OpenMPコードの分析
- 16.3.5 その他のOpenMPプラグマ
- 16.3.6 GPUプログラミング
- 16.4 パフォーマンスに関する一般的な考察
- 16.4.1 オーバーヘッドの要因
- 16.4.2 驚異的並列アプリケーションと非驚異的並列アプリケーション
- 16.4.3 静的なタスク割り当てと動的なタスク割り当ての対比
- 16.4.4 ソフトウェアの魔術:一般的な問題を驚異的並列問題に変える
- 16.5 並列Rコードのデバッグ
- B.1 パッケージの基本
- B.2 ハードドライブからのパッケージのロード
- B.3 Webからのパッケージのダウンロード
- B.3.1 パッケージの自動インストール
- B.3.2 パッケージの手動インストール
- B.4 パッケージ内の関数の列挙
私は元々統計学を余り好きではなかったけど、その理由が分かり、少し統計学を学習してみたくなった。そして、その後、統計学関連の本をいくつか読んでみた。けど、まだ本当に楽しいなあという気持ちにはなっていない。そのような状態で、本書に出会って読んでみる事に。
読み終えた時、いいタイミングで本書に出会えたかなあと感じた。というのも、統計学はまだそんなに楽しいなあと感じる事はないけど、プログラミング言語の学習は楽しいと感じている(といっても、ある言語を深く学習しているのではなく、いろんな言語(C#, Javascript, Python, Perl, Ruby, PHP等を広く浅く学習してる感じだけど)で、統計学の学習とは考えず、プログラミング言語の学習としてRを学習すれば、プログラミング言語の学習を楽しみつつ、おのずと統計学の学習も楽しめるようになるのではないかなあと思えたので。まだプログラミング言語Rを学習し始めた訳ではないので、統計学が実際に楽しめるようになるかは分からないけど。
でも、もし統計学を楽しく感じるようにならなくても、Rの学習自体、プログラミング言語の学習自体は楽しめそうなので、とりあえずRの学習を始めることを今年の目標の1つとしようと計画。
ということで、Rの学習の開始という今年の目標も出来たし、それによって、もしかしたら統計学が楽しくなるかもしれないし、本書を読んでよかったなあと思った今日この頃。
0 コメント:
コメントを投稿