R入門
統計解析
最終更新:
r-intro
目次
乱数
乱数を発生させる
runif関数を使う。第一引数には発生させる乱数の数を指定する。デフォルトでは、0~1の範囲の小数を返す。
> runif(5)
[1] 0.67853053 0.11993910 0.88077171 0.27966928 0.07728223
> d <- runif(1.e5)
> hist(d)
発生させる乱数の最小値と最大値は、それぞれminオプション、maxオプションで指定することができる。
一様分布する乱数を得る
runif関数を使う。runif関数は一様分布(指定の範囲内で各値が一様の確率で現れる分布)に基づく乱数を返す。第一引数に指定した個数の実数を返す。デフォルトでは0<x<1の範囲内の値を返すが、minオプションとmaxオプションに一様分布の範囲の両端の値をそれぞれ指定することができる。
マニュアルには「runif will not generate either of the extreme values unless max = min or max-min is small compared to min, and in particular not for the default arguments. 」とあり、原則両端の値は含まない乱数が返されることに注意。
> runif(6)
[1] 0.73539532 0.02306577 0.92723891 0.09129656 0.27582346 0.32496829
> runif(5, min = 0.5)
[1] 0.9989089 0.7668412 0.7744202 0.5232379 0.5672689
> runif(4, min = 0, max = 100)
[1] 78.59427 53.52239 65.26063 29.73860
> hist(runif(10 ^ 7), breaks = 100)
正規分布する乱数を得る
rnorm関数を使う。rnorm関数は正規分布に基づく乱数を返す。第一引数に指定した個数の実数を返す。デフォルトでは平均0、標準偏差1の正規分布の基づく乱数を返すが、meanオプションとsdオプションに正規分布の平均と標準偏差の値をそれぞれ指定することができる。
> rnorm(6)
[1] 0.8549655 1.6048736 -0.7680202 -0.6509009 0.3799471 1.4280449
> rnorm(6, mean = 10)
[1] 8.030706 9.324379 9.554407 9.463829 11.769583 8.810051
> rnorm(6, mean = 20, sd = 2)
[1] 19.10057 21.46614 20.83233 23.92880 22.03404 16.10972
> hist(rnorm(10 ^ 7, mean = 50, sd = 5), breaks = 40)
乱数の発生を再現する
runif関数などの乱数を発生させる関数を実行する前に、set.seed関数に任意の整数を与えて実行することで、同じ乱数を発生させることができるようになる。
以下の例のとおり、set.seed関数に3を与えて実行した後は、まったく同じ乱数が得られていることがわかる。
> runif(4)
[1] 0.41928296 0.26762217 0.04780944 0.10349305
> runif(4)
[1] 0.3140315 0.8006411 0.2293247 0.2129984
> set.seed(3)
> runif(4)
[1] 0.1680415 0.8075164 0.3849424 0.3277343
> runif(4)
[1] 0.6021007 0.6043941 0.1246334 0.2946009
> set.seed(4)
> runif(4)
[1] 0.585800305 0.008945796 0.293739612 0.277374958
> runif(4)
[1] 0.8135742 0.2604278 0.7244059 0.9060922
> set.seed(3)
> runif(4)
[1] 0.1680415 0.8075164 0.3849424 0.3277343
> runif(4)
[1] 0.6021007 0.6043941 0.1246334 0.2946009
その他
偏差平方和を標本数で割った分散と標準偏差を求めるための自作関数vari,stdをそれぞれ作る
以下は1~10の10個の数について、自作関数を作成して、それぞれ計算した例。dは標本(合計10個)、nは標本数。dssは偏差平方和。
> d <- 1:10
> n <- length(d)
> dss <- sum((d - mean(d)) ^ 2)
> dss
[1] 82.5
> dss / n
[1] 8.25
> vari <- function(d) sum((d - mean(d)) ^ 2 / length(d))
> vari(d)
[1] 8.25
> sqrt(dss / n)
[1] 2.872281
> std <- function(d) sqrt(sum((d - mean(d)) ^ 2 / length(d)))
> std(d)
[1] 2.872281
データの標準化をする
scale関数を使う。ただし、このscale関数では標準化への変換の際に、分散ではなく不偏分散(偏差平方和を「標本数-1」で割った値)を使うことに注意。
以下は、ベクトルでデータを与えた例。
> scale(c(1, 4, 9, 16,25))
[,1]
[1,] -1.0341754
[2,] -0.7239228
[3,] -0.2068351
[4,] 0.5170877
[5,] 1.4478455
attr(,"scaled:center")
[1] 11
attr(,"scaled:scale")
[1] 9.66954
引数に行列を与えると、列ごとにデータの標準化を行う。
> mx <- matrix((1:20) ^ 2, 5, 4)
> mx
[,1] [,2] [,3] [,4]
[1,] 1 36 121 256
[2,] 4 49 144 289
[3,] 9 64 169 324
[4,] 16 81 196 361
[5,] 25 100 225 400
> scale(mx)
[,1] [,2] [,3] [,4]
[1,] -1.0341754 -1.18262479 -1.21500315 -1.22911095
[2,] -0.7239228 -0.67015405 -0.65610170 -0.64967293
[3,] -0.2068351 -0.07884165 -0.04860013 -0.03511746
[4,] 0.5170877 0.59131240 0.60750157 0.61455548
[5,] 1.4478455 1.34030810 1.31220340 1.29934586
attr(,"scaled:center")
[1] 11 66 171 326
attr(,"scaled:scale")
[1] 9.66954 25.36730 41.15216 56.95173
不偏分散ではなく分散(偏差平方和を標本数で割った値)によるデータの標準化には、関数を自作する必要がある。以下は、標準偏差(偏差平方和を標本数で割った値の平方根)を求める自作関数stdと、分散によるデータの標準化を行う自作関数scaを使った例。
> std <- function(d) sqrt(sum((d - mean(d)) ^ 2) / length(d))
> sca <- function(d) (d - mean(d)) / std(d)
> sca(c(1, 4, 9, 16, 25))
[1] -1.1562432 -0.8093703 -0.2312486 0.5781216 1.6187405
> apply(mx, MARGIN = 2, sca)
[,1] [,2] [,3] [,4]
[1,] -1.1562432 -1.32221471 -1.35841482 -1.37418782
[2,] -0.8093703 -0.74925500 -0.73354400 -0.72635642
[3,] -0.2312486 -0.08814765 -0.05433659 -0.03926251
[4,] 0.5781216 0.66110736 0.67920741 0.68709391
[5,] 1.6187405 1.49851001 1.46708800 1.45271284
相関行列を求める
cor関数を使う。以下は、以下のデータで求めた例。
No, x1, x2
1, 190, 235
2, 85, 97
3, 94, 85
4, 151, 186
> x1 <- c(190, 85, 94, 151)
> x2 <- c(235, 97, 85, 186)
> mx <- matrix(c(x1, x2), 4, 2)
> mx
[,1] [,2]
[1,] 190 235
[2,] 85 97
[3,] 94 85
[4,] 151 186
> cor(mx)
[,1] [,2]
[1,] 1.0000000 0.9888381
[2,] 0.9888381 1.0000000
このcor(mx)で得られた行列が、相関行列。
分散共分散行列を求める
cov関数を使う。以下、計算例。
以下のデータで求める。
No, x1, x2
1, 190, 235
2, 85, 97
3, 94, 85
4, 151, 186
> x1 <- c(190, 85, 94, 151)
> x2 <- c(235, 97, 85, 186)
> mx <- matrix(c(x1, x2), 4, 2)
> mx
[,1] [,2]
[1,] 190 235
[2,] 85 97
[3,] 94 85
[4,] 151 186
> cov(mx)
[,1] [,2]
[1,] 2454 3527.00
[2,] 3527 5184.25
同様に、相関行列も求めてみる。相関行列を求めるにはcor関数を使う。
> cor(mx)
[,1] [,2]
[1,] 1.0000000 0.9888381
[2,] 0.9888381 1.0000000