交互作用モデルと、最初から変数として用意した重回帰分析の違いを調べてみた

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

まだ試してませんが、仕事でどうも変数同士が交互作用しているような気がする変数があります。例えば、中古の携帯電話の価格の推定をするとした場合、説明変数に発売年とカメラの画素数を加えるとすると、去年発売されたものの画素数が200万ぐらいなら価値がかなり下がるが、10年ぐらい前だとむしろ価値があがるといった具合です。でも、これを普通の回帰分析でやってしまうと、画素数の係数は一つの値しかでないので、発売年が去年でも10年前でも同じ値だけプラスすることになります。
で、これを解決してくれそうなのが交互作用モデルを用いた重回帰分析というわけです。
いや、実は言うと交互作用モデルについてはよく分かってない部分があるので、本当にこの解釈があっているかどうか自身を持ってはいえないのですが、そんなに間違ってないとは思います。多分。

ちなみに、交互作用モデルというのを簡単にいうと、上の携帯電話の価格の例でいうと、普通の重回帰分析では下記のような式を考えます。
『予測価格=a*発売年+b*カメラの画素数』
普通の重回帰分析ではこのaとbを求めるわけですが、交互作用モデルを用いた重回帰分析では下記のような式を考えます。
『予測価格=a*発売年+b*カメラの画素数+c*発売年*カメラの画素数』
この、aとbとcを求めるわけです。

ただ、ここで思ったわけです。最初から、『発売年*カメラの画素数』というような変数があった場合は、結果が異なるのかどうなのかと。例えば、『発売年*カメラの画素数』を含んだ『年画素』という変数が会った場合、
『予測価格=a’*発売年+b’*カメラの画素数+c’*年画素』
という式になるaとa’、bとb’、cとc’は違うのかどうなのかと。カテゴリー変数得られた係数の数値をそれぞれのカテゴリーに割り当てて重回帰分析した結果ですら同じになったので、多分同じになるんじゃないかと思いながらもやってみました。

利用したファイルは下記。
nico4
先ほど、ニコニコ動画の24時間の総合ランキングから取得したデータです。普段使っているニコ動のそれぞれのカテゴリーの合計データを使おうと思ったのですが、オーバーフローしてしまったので新しくとってきました。
今回試したのは、コメント数とマイリスト数を用いて再生数を推定するというもの。
結果は以下。

最初の『view~comment+mylist+comment*mylist』は『view~comment*mylist』でもOKです。
というわけで、結論。
全く同じなようです。自由度調整済み決定係数ぐらい異なるかもしれないと思っていましたが、それすら同じでした。

最初から変数同士の掛け算を入れた変数を用意できるなら、そうやるほうがいいような気がします。これだと、Rで、コメント数とコメント数とマイリスト数を掛けた値のみの重回帰分析というのも簡単にできるので(自分がやり方を知らないだけだとは思いますが)。

Excelで『未』という文字を書いたセルをオートフィルした結果

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

今回は小ネタ。知っている人も多いかもしれませんが、会社で偶然発見してビックリしたので。

Excelで、ある予定表のようなものを作成し、まだやっていないものは右側にまだやってないという意味の『未』と書く表をつくろうと思いました。例えば下記のような感じ。
autofill1

ところで、Excelでは特定のセルを選択し、その右下にポイントをあわせてドラッグするとそのセルの内容や、特殊な値の場合は連続したデータがコピーされます。これをオートフィルというよう。
例えば、”hoge”と入力されているセルを下にオートフィルすると”hoge”という文字が並んだセルの列ができます。また、”1月”というセルを下にオートフィルすると”2月”,”3月”といった具合に連続した意味のある内容が入力されます。”=A1″というセルを下にオートフィルすると”=A2″,”=A3″というようになります。”1″の下に”2″と書かれたセルの両方を選択して下にオートフィルすると、”3″,”4″,”5″となります。”1″,”3″だった場合は、”5″,”7″,”9″と等差数列になります。じゃあ、”1″,”2″,”4″の3つを選択してオートフィルしたら、等比数列を判定して”8″,”16″,”32″となるのでは! と期待しましたが、そうはなりませんでした・・・。
autofill2
いまいちよく分からない・・・。4つ目以降は等差数列になってるようなのだけれども・・・(多分、1つ目と2つ目の差の数と、2つ目と3つ目の差の数の二つの数の平均の等差数列になってる)。
参考:Excel2010(エクセル2010)基本講座:オートフィル

で、本題。予定表の右側に『未』と書いた列を作ろうとして『未』と書かれたセルをオートフィルするとどうなったか。
こうなりました。
autofill3
一瞬、何が起こったのか分かりませんでした。しばらくたってようやく理解。干支のオートフィル機能なんてものがあるんですね。ところで、未ってなんだっけ? 『ミ』だからへび年? いや、それは巳年か(正解は、ひつじ年だそう)。

仕方がないので、上二つのセルに『未』と書いて2つとも選択し、オートフィルすることに。
autofill4
調べてみると、こんなことせずにコントロールキーを押しながらオートフィルすると『未』というセルだけの列ができるようです。
まだまだExcelには知ってるようで知らないことがありそうな気がします。

Rから回帰分析のいろいろな情報を取得する方法

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

Rを使って重回帰分析をして、summary関数で重回帰分析に関する情報が見れるとわかったものの、『係数だけ』『自由度調整済み決定係数だけ』がほしい。そう思って取得方法をいろいろ調べてみました。
例によって、使うのは下記のニコ動からのデータ。
nico

上記は、コメント数とマイリスト数とカテゴリーを説明変数にして、再生数を目的変数とした重回帰分析の結果。

係数

lmオブジェクトの後に『$coefficients』、もしくは『[“coefficients”]』、coef(coefficients)関数を用いても取得できる。

一つ一つを取得したい場合は、後ろに『[“”]』でくくって、中に変数名をいれる。

残差

lmオブジェクトに$residualをつけるか、residuals(resid)関数を利用

lmオブジェクトを引数にしたsummary関数で表示されるような四分位数を取得したい場合は、上記の記述をsummary関数の引数とする。

予測値

lmオブジェクトに$fitted.valuesをつけるか、predict関数の引数にlmオブジェクトをいれる

切片を含む、説明変数の数

lmオブジェクトに『$rank』

自由度(標本数から説明変数(切片含む)の数を引いたもの)

$df.residualをつける。

カテゴリー変数の値

$xlevelsをつける。

これを、”category”という文字列(もしくは、その文字列をいれた変数)から取得したいのだけどやりかたが分からない。nico.lm[“category”][1]では取得できないようだし。data.frame関数通したらできるようではあるのだけど。

まわりくどい。自分が知らないだけで、何かいいやり方があると思うのだけど。

モデル式

formula関数を使うか、$callをつける(結果は異なる)

AIC(赤池情報量規準)

AIC関数の引数にいれる

解析に使用したデータのみのモデル

$modelをつける。

決定係数

lmオブジェクトを引数にしたsummary関数の後ろに$r.squared

自由度調整済み決定係数

lmオブジェクトを引数にしたsummary関数の後ろに$adj.r.squared

標準誤差

lmオブジェクトを引数にしたsummary関数の後ろに$coefficients[,”Std. Error”]

t値

lmオブジェクトを引数にしたsummary関数の後ろに$coefficients[,”t value”]

p値

lmオブジェクトを引数にしたsummary関数の後ろに$coefficients[,”t value”]

他にもいろいろあるようですが、自分が必要になりそうなもののみ列挙しました。なお、ここに書いてあるのはネットや書籍で調べたわけではなく、names関数を使って調べて行った結果、分かった方法です。

names関数、すごい便利です。