R

トップページ
Google
WWWを検索
サイト内を検索

回帰分析をするときに必要になってから覚えるものだと思いますが、Rには因子型(factor)と順序型(ordered)が標準で用意されています。因子型は性別のような排他的な選択肢をあらわすための変数型で、順序型は優・良・可・不可のような成績などのグレードのように、排他的な選択肢に序列をつけたものです。文字列型ではなく因子型にしておくと回帰の説明変数に用いることができ、順序型にしておくとさらに並び替えや順序回帰の被説明変数に用いることができます。

1 因子型(factor)

文字列型のベクトルがあれば、因子型にするのはas.factorを使うだけで簡単です。

以下のような文字列と数値だけのデータフレームを用意しました。

head(df01, 10)
   c          s
1  e -0.1613182
2  a  2.3952199
3  c -0.3948340
4  a  1.6902416
5  e  3.3308266
6  e  1.1825714
7  b  1.6758935
8  c -0.2154811
9  c -0.1146497
10 a  1.7977346

このデータフレームの文字の列を因子型にします。

class(df01$c)
[1] "character"
class({ df01$f <- as.factor(df01$c) })
[1] "factor"

簡単ですね。

文字列型と何が違うのかと言うと、因子型は要素の種類を保持しており、levelsでそれを取り出せます。

levels(df01$f)
[1] "a" "b" "c" "d" "e"

因子型の一部分を抜き出しても、levelsは代わりません。

levels(df01[1, ]$f)
[1] "a" "b" "c" "d" "e"

因子型にしなくても文字列型でも処理してくれる関数が多いので御利益は認識しづらいのですが、回帰分析の説明変数に使えます。

summary(lm(s ~ 0 + f, data = df01))

Call:
lm(formula = s ~ 0 + f, data = df01)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.9240 -0.4759  0.1841  0.6327  2.0596 

Coefficients:
   Estimate Std. Error t value Pr(>|t|)    
fa   2.1651     0.2909   7.442 2.26e-09 ***
fb   1.1495     0.3809   3.018 0.004182 ** 
fc  -0.4000     0.3359  -1.191 0.239980    
fd   1.2919     0.3039   4.252 0.000106 ***
fe   1.9828     0.3039   6.526 5.17e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.008 on 45 degrees of freedom
Multiple R-squared:  0.7377,    Adjusted R-squared:  0.7086 
F-statistic: 25.31 on 5 and 45 DF,  p-value: 4.717e-12

levelsをみるように作ってある関数は、一部を切り出してもlevelsの因子の種類ごとに集計してくれます。

# 全体を因子型ごとに平均値を集計
aggregate(s ~ f, df01, mean)
  f          s
1 a  2.1651495
2 b  1.1494811
3 c -0.4000185
4 d  1.2918595
5 e  1.9828303
# character型をつかって先頭から3行を集計(bとdは省略される)
aggregate(s ~ c, df01[1:3, ], mean, drop = FALSE)
  c          s
1 a  2.3952199
2 c -0.3948340
3 e -0.1613182
# factor型をつかって先頭から3行を集計(bとdはNAになる)
aggregate(s ~ f, df01[1:3, ], mean, drop = FALSE)
  f          s
1 a  2.3952199
2 b         NA
3 c -0.3948340
4 d         NA
5 e -0.1613182

2 順序型(ordered)

順序ロジスティック回帰をしないと意識しない気がしますが、順序型も用意されています。

o <- ordered(df01$c, levels = c("e", "a", "b", "c", "d"))

levels引数で因子を指定していますが、この並びが順序になります。eが他の文字より小さいと設定しました。

以下のように比較演算が可能です。

paste(sprintf("%s < %s = ", o[1], o[2]), o[1] < o[2])
[1] "e < a =  TRUE"
paste(sprintf("%s > %s = ", o[1], o[2]), o[1] > o[2])
[1] "e > a =  FALSE"

ソートもかけることができます。

sort(o)
 [1] e e e e e e e e e e e a a a a a a a a a a a a b b b b b b b c c c c c c c c
[39] c d d d d d d d d d d d
Levels: e < a < b < c < d

eが最初に来ていますね。

df01[order(o), ]

データフレームの並び替えにも使えます。

数値型にすると、levelsで指定したときの順番が戻ります。

as.integer(o)
 [1] 1 2 4 2 1 1 3 4 4 2 4 2 2 5 1 2 5 2 2 3 1 3 2 4 3 1 5 4 4 1 2 5 2 4 4 1 5 3
[39] 3 5 5 1 5 5 3 5 1 5 2 1