공식에서 cbind
여기에서는 다양하게 활용될 수 있는 cbind()
에 대해 알아봅니다.
lm
formula는 모형을 나타내기 위해서(model specification) 자주 쓰입니다. 이때 주의할 점은 모형 안의 +
가 산술의 더하기가 아니라는 점이입니다. 단지 어떤 변수들이 설명 변수 또는 독립 변수로 쓰이는지를 나타냅니다.
data(mtcars)
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 ## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 ## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
fit <- lm(qsec ~ cyl + wt,
data=mtcars)
summary(fit)
## ## Call: ## lm(formula = qsec ~ cyl + wt, data = mtcars) ## ## Residuals: ## Min 1Q Median 3Q Max ## -2.25369 -0.96105 0.07677 0.80139 2.57644 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 20.7434 0.8154 25.439 < 2e-16 *** ## cyl -1.1730 0.1972 -5.949 1.83e-06 *** ## wt 1.3563 0.3599 3.769 0.000747 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 1.221 on 29 degrees of freedom ## Multiple R-squared: 0.5634, Adjusted R-squared: 0.5333 ## F-statistic: 18.71 on 2 and 29 DF, p-value: 6.043e-06
만약 산술의 더하기를 나타내려면 I(a+b)
와 같이 써야 합니다.
lm(qsec ~ cyl + wt,
data=mtcars)
## ## Call: ## lm(formula = qsec ~ cyl + wt, data = mtcars) ## ## Coefficients: ## (Intercept) cyl wt ## 20.743 -1.173 1.356
lm(qsec ~ I(cyl + wt),
data=mtcars)
## ## Call: ## lm(formula = qsec ~ I(cyl + wt), data = mtcars) ## ## Coefficients: ## (Intercept) I(cyl + wt) ## 20.8449 -0.3186
위의 두 모형의 차이는 다음의 두 회귀식의 차이와 같습니다.
\[\textrm{qsec} = \beta_0 + \beta_1 \textrm{cyl} + \beta_2 \textrm{wt}\]
\[\textrm{qsec} = \beta_0 + \beta_1 \big(\textrm{cyl} + \textrm{wt}\big)\]
잘 알려지지 않은 multivariate regression에서는 결과 변수가 둘 이상입니다. 예를 들어 qsec와 hp를 cyl, wt를 통해 예측하려면 다음과 같이 쓸 수 있습니다.
lm(cbind(qsec, hp) ~ cyl + wt,
data =mtcars)
## ## Call: ## lm(formula = cbind(qsec, hp) ~ cyl + wt, data = mtcars) ## ## Coefficients: ## qsec hp ## (Intercept) 20.743 -51.806 ## cyl -1.173 31.388 ## wt 1.356 1.330
여기서 ~
의 좌측에 cbind()
가 쓰였음을 유의합시다. cbind()
를 생략하고 +
를 하면 전혀 다른 모형이 됩니다.
lm(qsec+hp ~ cyl + wt,
data =mtcars)
## ## Call: ## lm(formula = qsec + hp ~ cyl + wt, data = mtcars) ## ## Coefficients: ## (Intercept) cyl wt ## -31.062 30.215 2.687
두 모형의 차이는 다음과 같습니다. 추정해야 할 파라메터의 수가 6개와 3개로 큰 차이가 납니다.
\[
\begin{cases}
\textrm{qsec} = \beta_{10} + \beta_{11} \textrm{cyl} + \beta_{12} \textrm{wt}, \
\textrm{hp} = \beta_{20} + \beta_{21} \textrm{cyl} + \beta_{22}\textrm{wt} \
\end{cases}
\]
\[(\textrm{qsec} + \textrm{hp}) = \beta_{0} + \beta_1 \textrm{cyl} + \beta_2 \textrm{wt}\]
다변량 선형 회귀(multivariate regression)와 두 독립적인 선형 회귀의 차이는 다변수 선형 회귀는 두 선형 회귀을 동시에 진행한다는 점입니다.
그에 따라 모든 파라메터에 대해 공분산행렬을 구할 수 있습니다.
fit <- lm(cbind(qsec, hp) ~ cyl + wt,
data =mtcars)
fit
## ## Call: ## lm(formula = cbind(qsec, hp) ~ cyl + wt, data = mtcars) ## ## Coefficients: ## qsec hp ## (Intercept) 20.743 -51.806 ## cyl -1.173 31.388 ## wt 1.356 1.330
vcov(fit)
## qsec:(Intercept) qsec:cyl qsec:wt hp:(Intercept) ## qsec:(Intercept) 0.66491080 -0.06191005 -0.07312798 -12.943605 ## qsec:cyl -0.06191005 0.03887647 -0.05552509 1.205183 ## qsec:wt -0.07312798 -0.05552509 0.12951727 1.423559 ## hp:(Intercept) -12.94360542 1.20518301 1.42355884 688.050657 ## hp:cyl 1.20518301 -0.75679570 1.08088907 -64.064604 ## hp:wt 1.42355884 1.08088907 -2.52127127 -75.672934 ## hp:cyl hp:wt ## qsec:(Intercept) 1.2051830 1.423559 ## qsec:cyl -0.7567957 1.080889 ## qsec:wt 1.0808891 -2.521271 ## hp:(Intercept) -64.0646043 -75.672934 ## hp:cyl 40.2294229 -57.457440 ## hp:wt -57.4574404 134.024663
aggregate
집계 함수인 aggregate
에서도 formula를 활용합니다.
예를 들어, mtcars
에서 cyl
와 vs
에 따른 mpg
의 평균을 알고 싶다면,
aggregate(mpg ~ cyl + vs, data=mtcars, FUN= mean)
## cyl vs mpg ## 1 4 0 26.00000 ## 2 6 0 20.56667 ## 3 8 0 15.10000 ## 4 4 1 26.73000 ## 5 6 1 19.12500
이를 수식으로 나타내면 \(\mathbb{E[\textrm{mpg} | \textrm{cyl}, \textrm{vs}]}\) 가 됩니다. 물론 FUN=
을 어떻게 설정하느냐에 따라 평균을 구할 수도 있고, 최소값을 구할 수도 있고, 분산을 구할 수도 있습니다.
예를 들어 \(\mathbb{V}\textrm{ar}[\textrm{mpg} | \textrm{cyl}, \textrm{vs}]\) 를 구한다면,
aggregate(mpg ~ cyl + vs, data=mtcars, FUN= var)
## cyl vs mpg ## 1 4 0 NA ## 2 6 0 0.5633333 ## 3 8 0 6.5538462 ## 4 4 1 22.5445556 ## 5 6 1 2.6625000
만약 변수 mpg
뿐만 아니라 disp
의 분산도 같이 구하고자 한다면, cbind(, )
를 이용해야 합니다. +
를 쓴다면 산술적 의미의 더하기가 됨을 유의하세요.
aggregate(cbind(mpg, disp) ~ cyl + vs, data=mtcars, FUN= var)
## cyl vs mpg disp ## 1 4 0 NA NA ## 2 6 0 0.5633333 75.0000 ## 3 8 0 6.5538462 4592.9523 ## 4 4 1 22.5445556 774.2107 ## 5 6 1 2.6625000 2001.9033
aggregate(mpg + disp ~ cyl + vs, data=mtcars, FUN= var)
## cyl vs mpg + disp ## 1 4 0 NA ## 2 6 0 88.56333 ## 3 8 0 4419.14923 ## 4 4 1 582.36278 ## 5 6 1 2102.44917
matrix
마지막으로 행렬(또는 배열)에서 원소를 선택할 때에도 cbind(, )
를 사용할 수 있습니다.
mat <- matrix(1:16, 4, 4)
mat
## [,1] [,2] [,3] [,4] ## [1,] 1 5 9 13 ## [2,] 2 6 10 14 ## [3,] 3 7 11 15 ## [4,] 4 8 12 16
mat[c(1,4), c(2,3)]
은 원래 행렬의 첫 번째, 네 번째 행과 두 번째, 세 번째 열을 남긴 \(2\times 2\)-행렬을 나타냅니다. 그렇다면 행렬 mat
의 위치 (1,2)의 원소와 위치 (4,3)의 원소는 어떻게 표현할 수 있을까요?
mat[rbind(c(1,2), c(4,3))]
## [1] 5 12
만약 plot(x, y)
에서와 비슷하게 행 위치와 열 위치로 원소의 위치를 특정하고자 한다면, 다음과 같이 할 수 있습니다.
mat[cbind(c(1,4), c(2,3))]
## [1] 5 12
정리/요약
여기서는 matrix
/array
, lm
, 그리고 aggregate
에서 활용될 수 있는 cbind
에 대해 알아 보았습니다.[1]
[1]: 사실 matrix
의 일부를 선택할 때 쓰인 cbind
는 함수이고, lm
과 aggregate
의 cbind
는 공식(formula) 안에서 쓰여서 완전히 동일하지 않습니다.
Leave a comment