Rで「あてはめ」ができるまでの道筋　基本的な関数

# 基本的な関数
Rで利用できる基本的な関数を統計関数と数学関数にわけて紹介します。さらに関数を自作する方法を紹介します。

## 統計関数
以下のvector a、matrix A を用いて説明します。
```R
> a <- 1:10
> a
 [1]  1  2  3  4  5  6  7  8  9 10

> A
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
```
### mean()
vector a、matrix Aの平均です。
```R
> mean(a)
[1] 5.5
> mean(A)
[1] 5
```

Aの行、または列のみの平均です。
```R
> mean(A[1, ]) # Aの第1行の平均
[1] 2
> mean(A[, 1]) # Aの第1列の平均
[1] 4
```

### var()、 sd()
分散および標準偏差を求める関数です。
ここで、var()で求められる分散とは<font color="red">不偏分散</font>であることに注意が必要です。すなわち偏差平方和を項数$n$で除したものでなく、$n-1$で除したものです。もちろんsd()は不偏分散の平方根です。下記のcov()も同様です。
```R
> var(a) # 不偏分散
[1] 9.166667
> sd(a) # 不偏分散の平方根
[1] 3.02765
```
### max()、 min()
最大値、最小値を求める関数です。特に説明は必要ないでしょう。
```R
> max(a)
[1] 10
> min(a)
[1] 1
```
### quantile()
分位点を求める関数です。
例えば、vector aの20%の分位点(下側20%の点)を求めるには
```R
> quantile(a, 0.2)
20% 
2.8 
```
とします。
vector aの25%および75%分位点を同時に求めるには
```R
> quantile(a, c(0.25, 0.75))
 25%  75% 
3.25 7.75 
```
とすればできます。

# cov()、 cor()、 分散共分散行列、 相関行列
vector bを以下の通りとします。

```R
> b
 [1]  1  5  2  4  7  8  6  9  9 10
```
vector aとbの共分散は
```R
> cov(a, b)
[1] 8.388889
```
vector aとbの相関係数は
```R
> cor(a, b)
[1] 0.9021238
```
として求めます。

分散共分散行列を求めるには、aとbをくっつけて一度matrixにします。
```R
> C <- matrix(c(a, b), 10, 2)
> C
      [,1] [,2]
 [1,]    1    1
 [2,]    2    5
 [3,]    3    2
 [4,]    4    4
 [5,]    5    7
 [6,]    6    8
 [7,]    7    6
 [8,]    8    9
 [9,]    9    9
[10,]   10   10
```
このmatrix Cを使って分散共分散行列を求めます。
```R
> cov(C)
         [,1]     [,2]
[1,] 9.166667 8.388889
[2,] 8.388889 9.433333
```

同様にmatrix Cを用いて相関行列を求めます。
```R
> cor(C)
          [,1]      [,2]
[1,] 1.0000000 0.9021238
[2,] 0.9021238 1.0000000
```
### table()
度数分布を求めます。ここでは下記のvector v を用いて説明します。
```R
> v
 [1] 1 2 1 1 3 4 5 1 3 2
```
1が4つ、2が２つ...と同じ要素が複数ありますね。その個数(度数)を求め一覧表にして返すのがtable()です。
```R
> table(v)
v
1 2 3 4 5 
4 2 2 1 1 
```
引数をmatrixにすると、全要素を対象とした度数分布を返します。(Cの定義は上記をご覧ください)
```R
> table(C)
C
 1  2  3  4  5  6  7  8  9 10 
 2  2  1  2  2  2  2  2  3  2 
```
ところが、このmatrix Cをdata.frameに変換すると挙動が変わり、いわゆるクロス集計が返されます。
```R
> D <- as.data.frame(C)
> table(D)
    V2
V1   1 2 4 5 6 7 8 9 10
  1  1 0 0 0 0 0 0 0  0
  2  0 0 0 1 0 0 0 0  0
  3  0 1 0 0 0 0 0 0  0
  4  0 0 1 0 0 0 0 0  0
  5  0 0 0 0 0 1 0 0  0
  6  0 0 0 0 0 0 1 0  0
  7  0 0 0 0 1 0 0 0  0
  8  0 0 0 0 0 0 0 1  0
  9  0 0 0 0 0 0 0 1  0
  10 0 0 0 0 0 0 0 0  1
```


## 数学関数
$\sin x$や$\log x$など数学で用いられる初等関数の実装はもちろんあります。
準備として、円周率($\pi$)の表し方について述べておきます。
```R
> pi
[1] 3.141593
```
ということで、piとすれば得られます。

### 三角関数
まず、三角関数については以下の通りです。
```R
> sin(pi)
[1] 1.224647e-16
> cos(pi/3)
[1] 0.5
> tan(pi/3)
[1] 1.732051
```
もちろん、それらの逆関数asin()、acos()、atan()もあります。詳細は[こちら](https://stats.biopapyrus.jp/r/basic/math-function.html)を参照してください。

### 平方根・指数関数・対数関数
続いて、平方根・指数関数・対数関数です。
```R
> sqrt(3) # 平方根
[1] 1.732051
> exp(1) # 指数関数
[1] 2.718282

> e <- exp(1) # ネイピア数を定義
> log(e) # 対数関数(底:e)
[1] 1
> log10(10) # 対数関数(底:10)
[1] 1
> log2(2) # 対数関数(底:2)
[1] 1
```
底に注意してください。log()の底は$e$、log10()の底は10です。
その他、Rには底が2であるlog2()が用意されています。

### 四捨五入
最後に四捨五入関連の関数群です。
```R
> round(4.5) # 四捨五入(要注意)
[1] 4
> round(5.5) # 四捨五入(要注意)
[1] 6
> round(4.51) # 四捨五入(要注意)
[1] 5
> ceiling(4.5) # 小数点以下切り上げ
[1] 5
> floor(4.5) # 小数点以下切り捨て
[1] 4
> trunc(4.5) # 整数部分
[1] 4
> trunc(-4.5) # 整数部分
[1] -4
> floor(-4.5) # trunc(-4.5)との違いに注意
[1] -5
```
round()の挙動に注意してください。数学でいう四捨五入と微妙にずれます。「偶数への最近接丸め」という仕様になっているようです。詳細は[こちら](https://nigimitama.hatenablog.jp/entry/2018/11/30/131543)を参照してください。

trunc()とfloor()の挙動は似てますが、引数が負の数のとき、両者は異なります。すなわち$-4.5$の整数部分は$-4$ですが、小数点以下を切り捨てると$-5$になります。

## 自作関数
自分で関数を定義するには、以下のようにします。
例えば、引数のvector の偏差平方和を返す関数SSD()を定義するには
```R
SSD <- function(x) { # 偏差平方和 sum of squared deviations
	m <- mean(x)
	x0 <- x - m # 各値から平均mを引く
	sum(x0**2)
}
```
とします。この関数はsum(xs0**2)を返しますが、最終行は以下のようにreturn を用いて書いても同じ挙動です。
```R
return(sum(xs0**2))
```
これで関数SSD()が定義されました。使い方は以下の通りです。
```R
> SSD(v)
[1] 18.1
```


蛇足ですが、x - m について説明を加えておきます。
例えば、
```R
> x
[1] 1 2 3 4 5
```
としましょう。するとmすなわちmean(x)は当然
```R
> m <- mean(x)
> m
[1] 3
```
ですね。
ここで、xは5次元のベクトル、mはスカラーですから、数学的にはこれらの引き算は定義できません。
ところが、Rではx - m は次のように解釈され、計算されます。
```math
\mathrm{x} - \mathrm{m} =\left(\begin{array}{c}
1 \\
2 \\
3 \\
4 \\
5 \\
\end{array}\right) - 
\left(\begin{array}{c}
3 \\
3 \\
3 \\
3 \\
3 \\
\end{array}\right)
```
つまりスカラーであるmは、xと同じ次元のベクトルで、すべての成分がm(=3)に等しいベクトルに読み替えられて、引き算が計算されます。このような動作のことをブロードキャストと言います。

## 参考文献
統計関数、数学関数に関してより詳細な情報があります。下記を参照してください。(本文中のリンクと重複するものを含みます)
[biostatistics](https://stats.biopapyrus.jp/r/basic/math-function.html)
[ちょげぶろぐ](https://www.choge-blog.com/programming/rgetpi/)
[Rのround()は四捨五入をするわけではない](https://nigimitama.hatenablog.jp/entry/2018/11/30/131543)

トップページは[こちら](https://qiita.com/sflabtech/items/562dd78418926f00a0d5)