2013년 8월 30일 금요일

Vectorization in R

벡터에 제곱근 취하는 방법
v <- c(4, 7, 23.5, 76,2, 80)
x <- sqrt(v)

동일한 길이를 갖는 벡터에 대해 아래와 같이 계산했을 때, 벡터 각각의 성분에 대해 계산함. 즉, 4+34, 6+32.4, 87+12가 계산됨.
v1 <- c(4, 6, 87)
v2 <- c(34, 32.4, 12)
v1 + v2

위와 같은 계산에서 두 벡터의 길이가 동일하지 않다면?
R에서는 작은 벡터에 대해 recycling rule을 적용하여, 큰 벡터의 크기만큼 채워서 계산함. 즉, 아래의 계산결과는 4+10, 6+2, 8+10, 24+2.
v1 <- c(4, 6, 8, 24)
v2 <- c(10, 2)
v1 + v2

두 벡터의 길이가 위와 같이 배수 관계에 있지 않다면?
여전히 recycling rule이 적용되며, 경고(에러가 아닌)를 띄워줌.
v1 <- c(4, 6, 8, 24)
v2 <- c(10, 2, 4)
v1 + v2

이러한 맥락에서 아래와 같은 계산은 숫자 2를 벡터(c(2))로 간주하여, recycle 시켜 계산하는 것으로 볼 수 있음.
v1 <- c(4, 6, 8, 24)
2 * v1

2013년 8월 17일 토요일

partial least squares regression(PLSR) - R example

Partial least squares regression(PLSR)은 chemometric 분야에서 많이 사용되는 회귀분석 방법으로, 다수의 Y(종속변수)를 예측하고자 하는 경우, 변수(variable)의 갯수가 관측치(observation)의 갯수보다 많은 경우, X(독립변수)들 간에 다중공선성(multicollinearity)이 존재하는 경우에 적합한 분석 방법이다.

다중 선형 회귀(Multiple linear regression, MLR)는 X들 간에 다중공선성이 존재하는 경우 정확한 회귀모수의 추정이 어렵기 때문에 적용하기 어렵다. 이 경우 능형회귀(ridge regression), 주성분 회귀(principal component regression, PCR), 그리고 PLSR을 이용하여 분석할 수 있다.


간단히 PLSR을 도식화 하면 다음과 같이 표현할 수 있다.

X : 독립변수 행렬(n x m)
Y : 종속변수 행렬(n x p)
T : X의 요인(factor) 행렬(n x l)
U : Y의 요인(factor) 행렬(n x l)
P : X의 요인 적재값(factor loading) 행렬(m x l)
Q : Y의 요인 적재값(factor loading) 행렬(p x l)
E, F : 오차항(error term)
       ~ iid(independent and identically distributed)

즉, PLSR은 공분산(covariance)이 최대가되는 X의 선형결합과 Y의 선형결합을 찾는 방법론이다.



[R example]
library(pls)

data(gasoline)


# Figure 1. NIR spectra

wavelengths <- seq(900, 1700, by=2)
matplot(wavelengths, t(gasoline$NIR), type="l", lty=1,
    xlab="wavelengths(nm)", ylab="log(1/R)")

# gasoline 데이터로 PLSR 분석
# 성분 수: 10
# leave-one-out(LOO) cross validated prediction
gas1 <- plsr(octane ~ NIR, ncomp = 10, data = gasoline,
    validation = "LOO")

# 분석 결과 요약
summary(gas1)

# Cross-validated RMSEP curves
plot(RMSEP(gas1), legendpos = "topright")

# Cross-validated predictions with 3 components vs. measured
plot(gas1, ncomp = 3, asp = 1, line = TRUE)

# Loading plot
plot(gas1, "loadings", comps = 1:3, legendpos = "topleft")
abline(h = 0)


참고자료
YouTube - Partial Least Squares Regression 1 Introduction
R News Volume 6/3, August 2006 - The pls package