データフレームの各カラムへのアクセス方法

概要

・タイトル通り,データフレームの各カラム(列)へのアクセス方法が色々あるようなのでまとめる
・R初心者のワタクスですら現状把握してるだけでも4通りあるが,attachを使うのが一番簡単そう.

方法1: 列数を指定

ベーシックな方法

データはRにデフォルトで入っている airquality データフレームを使います.
データの詳細はこちら.ニューヨークの大気の状態の観測値のようですね.

R: New York Air Quality Measurements
http://stat.ethz.ch/R-manual/R-patched/library/datasets/html/airquality.html

[,1]とすることで,1列目のデータを取得する

方法2: $で列名を指定

たとえば,4列目に格納されている気温(カラム名Temp, 単位はファーレンハイト)を取得したい場合は

方法3: withを使う

withを使うことで,with()で囲まれた中では”airquality$”という記述を省略できる模様.

方法4: attachを使う

attachでデータフレームを指定することで,それより以下の部分でairquality$の記述を省略できる模様.
airqualityの中身を使わなくなったら,detach()する必要がある.
detach()以降では,airquality$の記述は省略できない.

attach()の参考は以下
R-Source
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/46.html

また,attachよりも前に既にカラム名と同名の変数が宣言されていた場合,attachを使ってもカラム名にアクセス出来ないので注意する必要がオオアリクイということで.

ARモデルのパラメータ最尤推定を思い出す

概要

・RだとARのパラメータはコマンド1つで推定してくれますが,はてこれってどうやって推定してるんだっけというのを思い出すための計量経済学 俺様メモの続編でございます.

適当にサンプルデータ生成

パラメータ生成用にAR過程に従うサンプルパスを生成しておきます.

今回は簡単のため,AR(1)過程を生成.パラメータは0.9としております.

$$
y_t = c + \mu y_{t-1} + \epsilon_t \\
\epsilon_t \sim N \left(0, \sigma^2 \right)
$$

というモデルです.
推定するパラメータは\(c, \mu, \sigma\)の3つですな.

尤度

基本的には\(y_1\)から\(y_{1000}\)までの同時密度が必要なわけですが,AR過程の場合は,ベイズの定理を使って同時密度を分解します.

$$
f \left(y_1, y_2, \cdots | c; \mu, \sigma \right) = \prod_{t} f \left(y_t | y_{t-1}, c; \mu, \sigma \right)
$$

\(t-1\)時点から見て,\(t\)時点の値の確率密度関数は正規分布に従いまして,

$$
y_t | y_{t-1} \sim N\left( c + \mu y_{t-1}, \sigma^2 \right)
$$

と.ということでAR(1)の場合には,1期前より前の値は無視して良いということですな.
で,実際にRで計算させると,

関数lで対数尤度を計算して,optimにぶっこんで最適化させます.

ということで
\(c = 0.046, \mu = 0.899, \sigma = 0.984\)というそれっぽい値が出てきます.
一方で\(\mu\)の真値は0.9

確認

一応既存のarメソッドでも推定してみます.

まあ大体同じような値が出てきますね(― ―)
この微妙な誤差はなんやねんというところですが,どうもoptimの推定は初期値を変えると微妙に推定結果が変わるのと
もしかしたら\(y_0\)の処理とかが微妙に異なるのとか色々考えられますが,まあ時間も時間ですし(もう眠い時間帯です),どう推定するのかがわかったということで良しとしておきます.

今回はAR(1)を推定しましたが,任意のAR(p)過程も,基本的に条件付き密度は正規分布ですので推定できると思います.
次元が上がるので推定に時間がかかると思いますが....

という俺様メモでしたm(_ _)m

参考文献

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー): 沖本 竜義: 本 – http://www.amazon.co.jp/dp/4254127928

ARモデルのパラメータ推定法[ストレスと自律神経の科学]
http://hclab.sakura.ne.jp/stress_nervous_ar.html

VAR(ベクトル自己回帰)で非農業部門雇用者数を予測する

概要

・計量経済学の俺様メモシリーズ VAR編
・ADP雇用者数(以下ADP)と非農業部門雇用者数(以下NFP)を使って次期のNFPを予測したい

はじめに

米労働省が月初第一金曜日に発表するNFP(いわゆる雇用統計)の増加分を予測したい.
FRB(アメリカの中央銀行のようなもの)は物価の安定と同時に,雇用最大化もマンデートとしているため,雇用者数の増加分というのは金融政策にも影響を与える.それを事前に予測できればお小遣いくらいは稼げるかもしれない

使うデータ

1. ADP雇用者数
これは民間会社であるADPが算出・公表しているデータ.月初第一水曜日に公表される

ADP全国雇用者数とは|金融経済用語集
http://www.ifinance.ne.jp/glossary/economy/eco028.html

2. NFP
米労働省が公表しているデータ.月初第一金曜日に公表される.

2つのデータは基本的には同じものを算出しているがADPのほうが2営業日前に公表される.
マーケットもADPをNFPの前哨戦と位置づけていることが多い.

データの取得

セントルイス連銀先生からデータを取得します.

ADPはこちらから,
Total Nonfarm Private Payroll Employment (NPPTTL) – FRED – St. Louis Fed
http://research.stlouisfed.org/fred2/series/NPPTTL?cid=32305

NFPはこちらから,
All Employees: Total nonfarm (PAYEMS) – FRED – St. Louis Fed
http://research.stlouisfed.org/fred2/series/PAYEMS?cid=32305

ページ左側の「Download Data」というところから取得できるかと思います.

Rで読み込み,グラフ描画

上記サイトから取得できる系列は,『当月時点での雇用者数』である一方,実際にマーケットから注目されているのは『当月での雇用者数の変化分』ということなので,diffを取る必要があります.

ADPの方がデータが新しく,2001年4月以降のデータがありませんので,diffが取れるのは2001年5月からということになります.
適当にRで読み込み,diffをとってグラフを描画すると以下のような感じ

140112_1

黒い線がADPで,赤い線がNFPです.
(2013年12月分を予測したいので2013年11月分までしか描画していません)
まあ大体(?)同じような動きをしておりますし,もしかしたら予測力があるかもしれませんよ!!

VARモデル満を持して登場

VARはどこかの偉い方が既にパッケージ(varsライブラリ)として配布されておりますのでそれを利用させて頂きます.
ちなみにドキュメントはこちら
http://cran.r-project.org/web/packages/vars/vars.pdf

ということでライブラリをロードして,まずはVARの次数を推定してみます.
VARselect第一引数はADP変化とNFP変化をデータフレームに打ち込んだものとなっておりまして,一応中身としては

となっております.
また,モデルのタイプはとりあえず定数ベクトルだけを入れたシンプルなもので,
AR過程のベクトル版ですな.VAR(1)だと以下のような形

$$
\left(
\begin{array}{c}
y_{1,t} \\
y_{2,t} \\
\end{array}
\right)
=
\left(
\begin{array}{c}
c_1 \\
c_1 \\
\end{array}
\right)
+
\left(
\begin{array}{cc}
b_{11} & b_{12} \\
b_{21} & b_{22} \\
\end{array}
\right)
\left(
\begin{array}{c}
y_{1, t-1} \\
y_{2, t-1} \\
\end{array}
\right)
+
\left(
\begin{array}{c}
\epsilon_{1, t} \\
\epsilon_{2, t} \\
\end{array}
\right)
$$

で,varselectを実行すると

とまあ色々な基準で次数を選んでくれます.$selectionの部分がそれぞれの基準での次数となっておりまして,どれも次数1となっております.したがって上述したVAR(1)ということですね.

さて,この式を使って12月分の予測もしてみます.

まず1行目でVARモデルの実行.第2引数は先ほど推定した次数,第3引数はモデルの形ということで定数込のモデルを指定します.
で,predict関数で1期先までを推定.

実行すると以下のような結果が返ってきます.
見づらいですがfcst(forecast)の値が予測値となります.
lowerとupperは信頼区間(デフォルトでは95%),CIはドキュメントには記載が無いように見えましたがfcstから信頼区間上限・下限までの距離ですかな.

ということで,12月分ADPは223.152千人(単位は千人です),NFPは225.7227千人となります.

実際どうなのよ

まずADPの12月分はどうなったかと言いますと,

ADP National Employment Report | NER
http://www.adpemploymentreport.com/

140112_2

ということで238,000(var予測は223,152)となりました.
まあこんなもんですかなあ(― ―)??

で,問題のNFP12月分

U.S. Bureau of Labor Statistics
http://www.bls.gov/

140112_3

( ゚д゚) ・・・

(つд⊂)ゴシゴシ

(;゚д゚) ・・・

(つд⊂)ゴシゴシゴシ

(;゚Д゚) …74,000!?

というわけで,全然当たりませんでした笑(var予測は225,722.7)

ちなみに

2月第一金曜日に公表される1月分の予測もしてみます.

ということでADPは217k, NFPは231kがVARモデルによる予測となります.

ちなみに2

今回の予測は厳密には正しくありません.
というのも12月NFPが公表された時に11月NFPも修正されているのですが,今回は11月の修正後のデータを使って12月分を予測しているためです.
当然12月分が公表される前の時点では,11月分の修正分も知ることはできません.

ただし最後に行なった1月分の予測に関しては,現時点で収集できるデータのみを使っているのでデータの観点からは正しいかと思います.

ちなみに3

今回は11月分までのADP,NFPの値を使って,12月分のADP,NFPを予測しました.
ですが,マーケットの注目度は断然NFPの方が高く,マーケットの反応も一般的にはNFPの方に大きく影響されています.
なので,12月ADPも観測した上で,NFP12月分だけを予測するという方法も考えられますので誰かやってみてください(他力本願)

参考文献

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー): 沖本 竜義: 本 – http://www.amazon.co.jp/dp/4254127928

mysql.connectorが使えるようになるまで

概要

・地味にハマったのでPythonからMySQLサーバー(Amazon RDS)にアクセスするまでの俺様メモ
・実際にpythonからselect文とinsert文を実行する
・Windows版Python 2.7.6を想定(macはもっと簡単でしたorz)

PythonのWindows版をインストール

Releases
http://www.python.org/download/releases/

適当にこの辺りからインストール

コマンドプロンプトでPythonが使用できるようにする

このままではコマンドプロンプトでpythonを使用することが出来ないので環境変数をいじくる

3. Using Python on Windows — Python v2.7.6 documentation
http://docs.python.org/2/using/windows.html

環境変数PATHに
C:\Python27
といったパスを追加.

Mysql.connectorのインストール

PythonからSQLを叩くライブラリは色々あるようですが無難にmysql.connectorを選択
ライブラリ自体は下記からダウンロード

2. mysql-connector-python 1.0.12 : Python Package Index
https://pypi.python.org/pypi/mysql-connector-python/

ダウンロードされたzipを解凍し,下記サイトに書かれているように,コマンドプロンプトからpython setup.py installでインストール

3.MySQL :: MySQL Connector/Python :: 4.3 Installing Connector/Python Source Distribution on Microsoft Windows
http://dev.mysql.com/doc/connector-python/en/connector-python-installation-source-windows.html

select文の実行

これで一応使える準備は整ったはずなので以下ようなのコードでテスト
サーバー情報,テーブル情報は架空のものとしています.
例えば,DATEとVALUEというカラムが存在するテーブル(TABLE)を読みに行くとしたらこんな感じになるかと思います.

以下のサイトも参考になると思います.

MySQL :: MySQL Connector/Python :: 5.4 Querying Data Using Connector/Python
http://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-select.html

insert文の実行

データベースに新たなレコードを追加するにはinsert文を実行するかと思いますが,その際には
コミットのための1行が追加となります.

ご参考には以下のページ

MySQL :: MySQL 5.5 Reference Manual :: 22.6.4.3 Inserting Data Using Connector/Python
http://dev.mysql.com/doc/refman/5.5/en/connector-python-example-cursor-transaction.html

ということでハマりましたというお話でした.