1.12 R 에서 기본 수학 표현
1.12.1 기본 연산 (Basic operation)과 기본 초월함수
Math text | R expression |
---|---|
\(a + b\) | a + b |
\(a - b\) | a - b |
\(a \times b\) | a * b |
\(a \div b\) | a / b |
x의 반올림 | round(x) |
x의 버림/내림 | floor(x) |
x의 올림 | ceiling(x) |
정수 연산 \(5 \div 2\) 의 나머지(modulus) | %% 2 |
\(1 \times 10^3\) | 1e3 |
\(\sqrt{x}\) | sqrt(x) |
\(a^x\) | a^x |
\(log_e x, ln(x)\) | log(x) |
\(log_{10} x\) | log10(x) |
\(e^{x}\) | exp(x) |
x! | factorial(x) |
nCr, \(\binom{n}{r}\) | choose(n, r) |
nPr | factorial(n)/factorial(n - r) |
\(\Gamma (x)\) | gamma(x) |
arg min f(a,b,c), \(\displaystyle{min_{\substack{arg}}} f(a, b, c)\) | optim(c(a, b, c), f, method="L-BFGS-B", \(\cdots\)) |
R의 반올림 함수 round() 는 round-to-even number 방식임에 주의한다.
감마(Gamma) 함수는 factorial(계승) 함수를 실수 또는 복소수 영역까지 확장한 것이다. 정수 n에 대해서 \(\Gamma(n) = (n - 1)!\)이다. 감마 함수나 factorial 함수는 결과값이 너무 크게 나오기 쉽다. 그래서, 그것의 자연로그값을 return해주는 lgamma 와 lfactorial 함수가 있다. 통계에서는 복소수(complex number)는 사용하지 않고, 실수(real number)를 사용한다. 모든 행렬도 실수 행렬(real matrix, matix of real number)이다. 통계나 자연과학에서는 밑(base)을 10으로 하는 상용로그는 잘 사용하지 않고, 주로 e(2.718281828…)을 밑으로 하는 자연로그(natural log)를 사용한다. 앞으로 별다른 말이 없으면 모두 자연로그이다.
R에는 optim 외에도 nlminb 등 많은 minimization 함수들이 있다. 만약 2계 미분 가능한 목적함수라면 optim 에서 L-BFGS-B 또는 BFGS method를 권한다.
삼각함수도 sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh 등 다양하게 있다.
1.12.2 논리 연산 (Logic operation)
Math | R expression |
---|---|
a and b | a & b |
a or b | a | b |
not a, ~a | !a |
\(\forall x\) | all(x) |
\(\exists x\) | any(x) |
a나 b가 vector인 경우에 의도치 않게 첫 번째만 비교한 결과를 받을 수 있으므로 이에 대해 주의해야 한다. all 이나 any 함수가 유용할 수 있다.
1.12.3 집합 연산 (Set operation)
math | R expression |
---|---|
합집합, a union b, \(a \cup b\) | union(a, b) |
교집합, a intersection b, \(a \cap b\) | intersect(a, b) |
차집합, a minus b, \(a - b\) | setdiff(a, b) |
곱집합, a product b, \(a \times b\) | expand.grid(a, b), outer(a, b, paste) |
부분집합여부, \(a \subset b\) | a %in% b |
차집합(minus)의 경우에는 순서가 중요하다. 순서를 바꾸면 다른 결과가 나온다.
expand.grid와 outer 함수의 경우에는 결과가 같은 유형(type)의 set는 아니다.
부분집합(포함) 여부를 판단하는 %in% 연산자의 결과는 TRUE 또는 FALSE 가 된다.
1.12.4 벡터 연산 (Vector operation)
Math | R expression |
---|---|
vector \(\begin{bmatrix} a \\ b \end{bmatrix}\) | c(a, b) |
\(x_i\) | x[i] |
\(\Sigma x_i\) | sum(x) |
\(\Pi x_i\) | prod(x) |
inner product \(a \cdot b\) | sum(a*b) or crossprod(a, b) |
outer product \(a \times b\) | c(a[2]*b[3] - a[3]*b[2], a[3]*b[1] - a[1]*b[3], a[1]*b[2] - a[2]*b[1]) |
R에서는 따로 scalar type 과 vector type으로 나누지 않는다. Scalar는 길이가 1인 vector이다.
R에서 기본적으로 벡터는 열벡터(column vector)라고 가정하는데, 이는 뒤에 나오는 column(열)이 하나인 행렬(matrix)과 같다. 경우에 따라서는 R이 암묵적으로(implicitly) 행벡터(row vector)로 변환하기도 한다. 그러나, 이런 것에 의존해서는 안되고, 사용자가 최대한 명시적으로 표시해 주어야 한다.
Matrix에서 하나의 행을 추출하면 저절로 열벡터로 변환된다. 행벡터를 유지하고 싶다면 drop=FALSE 라는 옵션을 index부분에 다음과 같이 넣어 주어야 한다. 다음은 M이라는 matrix에서 i번째 행을 추출하면서 계속 행벡터를 유지하게 하는 명령어이다.
=FALSE] M[i, , drop
R에서는 특이하게도 길이가 다른 두 벡터에 대한 연산을 하는 경우 에러 메시지 없이 짧은 vector를 긴 vector길이에 맞도록 복제한다. 이때 정수배가 되지 않을 때만 경고 메시지가 나온다. 이것이 (scalar와 vector 또는 matrix와 연산할 때) 편리하지만, 사용자가 의도치 않은 것일 수 있으니 주의를 요한다.
1.12.5 행렬 연산 (Matrix operation)
Math | R expression |
---|---|
matrix \(\begin{bmatrix} a & c \\ b & d \end{bmatrix}\) (순서 주의) | matrix(c(a, b, c, d), ncol=2) |
matrix product AB | A %*% B |
transpose of A, \(A^T\), \(A\prime\) | t(A) |
determinant of A | det(A) |
\(X^T X\) | crossprod(X) |
\(X^T Y\) | crossprod(X, Y) |
inverse of A, \(A^{-1}\) | solve(A) |
\(A^{-1}B\) | solve(A, B) |
generalized inverse of A, \(A^-\) | MASS::ginv(A) |
g2 generalized inverse of A, \(A^-\) | sasLM::G2SWEEP(A) |
R에서는 dim 이라는 속성을 이용하여 vector, matrix, 3차원 이상의 array를 자유롭게 변환시킬 수 있다. 하지만, 간혹 사용자는 scalar value라고 생각했는데, 1 x 1 matrix이어서 conformational mismatch error가 발생하는 경우가 있다. 이 때는 as.numeric 함수를 이용해서 vector type으로 변환 후 연산해 주어야 한다.
Generalized inverse는 unique하지 않지만, g2 generalized inverse는 unique하므로 Searle이 옹호하고, SAS가 사용하고 있다. 따라서, SAS output을 재현하려면 g2 inverse가 필요하다.
어떤 matrix가 singular(비정칙)하다는 것은 determinant(행렬식)가 0으로서 역행렬(inverse matrix)이 존재하지 않는다는 뜻인데, 이런 경우 선형회귀분석이나 분산분석에서 해(solution, 결과 output)가 일의적으로 결정되지(uniquely determined) 않게 된다. 이럼에도 불구하고 SAS, SPSS 등은 일관성을 유지하면서 output을 산출하기 위해 g2를 도입하게 된 것으로 보인다.
하지만, 이런 방식을 반대하는 통계학자도 많다. R을 만든 사람들이나 Applied Regression Analysis를 쓴 Normal R. Draper 같은 사람들이 그러한데, 역행렬이 존재하지 않는 경우, generalized inverse를 사용하지 말고, 다른 통계모형을 사용하거나 자료를 보충하라고 권고하고 있다.
SAS, SPSS에서 분산분석 결과로 Type III SS라는 것을 보여주는데, 이것을 계산하려면 많은 경우에 g2 inverse가 필요하다. 하지만, R에서는 이런 방식을 싫어하기 때문에 기본적으로 지원해 주지 않는다. R 개발에 중요한 역할을 한 W.N. Venables의 신랄한 비판을 https://www.stats.ox.ac.uk/pub/MASS3/Exegeses.pdf 에서 볼 수 있다. R car package의 Anova 함수가 Type III SS를 지원하지만, 단순한 모형에서만 결과가 같고, nested design, split-plot design, aliased model과 같은 경우에는 SAS와 결과가 다르다. (SPSS도 SAS 진영으로서 SAS와 같은 결과를 내준다.) 그러나, 이것은 car package의 결과가 틀렸다기보다는 견해나 방식이 다르기 때문이다. 하지만, 제약업계를 비롯한 많은 산업계에서 SAS를 표준으로 삼기 때문에, R에서도 구현이 필요해서 sasLM이라는 package를 개발하였다.
1.12.6 통계 분포 함수 (Statistical distribution function)
Math | R expression |
---|---|
pdf of normal distribution, \(\frac{1}{\sqrt{2 \pi {\sigma}^2}} e^{- \frac{(x-\mu)^2}{2{\sigma}^2}}\) | dnorm(x, mean, sd) |
cdf of normal distribution, \(\Phi(x)\), \(\int_{-\infty}^{x} \frac{1}{\sqrt{2 \pi {\sigma}^2}} e^{- \frac{(x-\mu)^2}{2{\sigma}^2}}\) | pnorm(x, mean, sd) |
inverse of cdf of normal distribution, \(\Phi^{-1}\) | qnorm(p, mean, sd) |
다른 분포 함수들의 경우 앞의 d, p, q는 동일하고, 함수 이름들만 바꾸어 주면 된다. 예를 들어, t 분포의 경우 위 해당 함수들은 각각 dt, pt, qt이고 F 분포의 경우에는 df, pf, qf, 이항 분포의 경우 dbinom, pbinom, qbinom, 포아송 분포의 경우, dpois, ppois, qpois 가 된다. 각 분포를 따르는 난수(random number)를 발생시키고 싶을 때는 d, p, q 대신 r을 붙인 함수를 사용하면 된다. 예를 들어, 표준정규분포를 따르는 난수 100개를 발생시키고 싶으면 rnorm(100) 같이 하면 된다. R에는 기본적으로 20여 가지 이상의 분포 함수가 내장되어 있다.
만약 유한 모집단(finite population)에서 복원(with replamcement) 또는 비복원(without replacement) 추출(sampling)을하고 싶으면 sample 함수를 사용하면 된다.