"지리학 적으로 가중치가 부여 된 PCA"는 매우 설명 적입니다.에서 R
프로그램은 실제로 자체적으로 작성합니다. 실제 코드 줄보다 많은 주석 줄이 필요합니다.
이 가중치는 PCA 자체에서 지리적으로 가중치가 부여 된 PCA 부품 회사이기 때문에 가중치부터 시작할 수 있습니다. "지리적"이라는 용어는 가중치가 기준점과 데이터 위치 사이의 거리에 의존한다는 것을 의미합니다. 가중치는 가우스 함수이지만 표준은 아닙니다. 즉, 제곱 거리에 따른 지수 붕괴입니다. 사용자는 붕괴율 또는보다 직관적으로 고정 된 양의 붕괴가 발생하는 특성 거리를 지정해야합니다.
distance.weight <- function(x, xy, tau) {
# x is a vector location
# xy is an array of locations, one per row
# tau is the bandwidth
# Returns a vector of weights
apply(xy, 1, function(z) exp(-(z-x) %*% (z-x) / (2 * tau^2)))
}
PCA는 공분산 또는 상관 행렬 (공분산에서 파생)에 적용됩니다. 여기에서 가중 공분산을 수치 적으로 안정적인 방식으로 계산하는 함수입니다.
covariance <- function(y, weights) {
# y is an m by n matrix
# weights is length m
# Returns the weighted covariance matrix of y (by columns).
if (missing(weights)) return (cov(y))
w <- zapsmall(weights / sum(weights)) # Standardize the weights
y.bar <- apply(y * w, 2, sum) # Compute column means
z <- t(y) - y.bar # Remove the means
z %*% (w * t(z))
}
각 변수의 측정 단위에 대한 표준 편차를 사용하여 일반적인 방식으로 상관 관계가 도출됩니다.
correlation <- function(y, weights) {
z <- covariance(y, weights)
sigma <- sqrt(diag(z)) # Standard deviations
z / (sigma %o% sigma)
}
이제 PCA를 할 수 있습니다 :
gw.pca <- function(x, xy, y, tau) {
# x is a vector denoting a location
# xy is a set of locations as row vectors
# y is an array of attributes, also as rows
# tau is a bandwidth
# Returns a `princomp` object for the geographically weighted PCA
# ..of y relative to the point x.
w <- distance.weight(x, xy, tau)
princomp(covmat=correlation(y, w))
}
(지금까지는 순 10 줄의 실행 가능한 코드입니다. 분석을 수행 할 그리드를 설명하고 나면 아래에 하나만 더 필요합니다.)
질문에 설명 된 것과 비교할 수있는 임의의 샘플 데이터 (550 개 위치의 30 개 변수)를 예로 들어 보겠습니다.
set.seed(17)
n.data <- 550
n.vars <- 30
xy <- matrix(rnorm(n.data * 2), ncol=2)
y <- matrix(rnorm(n.data * n.vars), ncol=n.vars)
지리적으로 가중 된 계산은 종종 횡단 선을 따라 또는 정규 그리드의 점과 같은 선택된 위치 세트에서 수행됩니다. 거친 격자를 사용하여 결과에 대한 관점을 살펴 보겠습니다. 나중에 모든 것이 작동한다고 확신하고 원하는 것을 얻는다면 그리드를 세분화 할 수 있습니다.
# Create a grid for the GWPCA, sweeping in rows
# from top to bottom.
xmin <- min(xy[,1]); xmax <- max(xy[,1]); n.cols <- 30
ymin <- min(xy[,2]); ymax <- max(xy[,2]); n.rows <- 20
dx <- seq(from=xmin, to=xmax, length.out=n.cols)
dy <- seq(from=ymin, to=ymax, length.out=n.rows)
points <- cbind(rep(dx, length(dy)),
as.vector(sapply(rev(dy), function(u) rep(u, length(dx)))))
각 PCA에서 어떤 정보를 보유하고 싶은지에 대한 질문이 있습니다. 일반적으로, n 개의 변수에 대한 PCA는 n 개의 고유 값 의 정렬 된 목록 과 다양한 형식으로 각각 길이가 n 인 n 개의 벡터에 해당하는 목록을 리턴합니다 . 그것은 n * (n + 1) 개의 숫자입니다. 질문에서 힌트를 얻어 고유 값을 매핑 해 봅시다. 이들은 속성 을 통한 출력에서 추출 됩니다. 속성은 내림차순으로 고유 값 목록입니다.gw.pca
$sdev
# Illustrate GWPCA by obtaining all eigenvalues at each grid point.
system.time(z <- apply(points, 1, function(x) gw.pca(x, xy, y, 1)$sdev))
이 컴퓨터에서 5 초 이내에 완료됩니다. 에 대한 호출에서 1의 특성 거리 (또는 "대역폭")가 사용되었습니다 gw.pca
.
나머지는 정리의 문제입니다. raster
라이브러리를 사용하여 결과를 매핑합시다 . (대신, GIS를 사용한 후 처리를 위해 결과를 그리드 형식으로 기록 할 수 있습니다.)
library("raster")
to.raster <- function(u) raster(matrix(u, nrow=n.cols),
xmn=xmin, xmx=xmax, ymn=ymin, ymx=ymax)
maps <- apply(z, 1, to.raster)
par(mfrow=c(2,2))
tmp <- lapply(maps, function(m) {plot(m); points(xy, pch=19)})
이들은 30 개의지도 중 첫 번째 4 개이며 4 개의 가장 큰 고유 값을 보여줍니다. (모든 위치에서 1을 초과하는 크기로 너무 흥분하지 마십시오. 이러한 데이터는 완전히 무작위로 생성 되므로 상관 관계 구조가있는 경우 이러한 맵의 고유 한 값이 표시되는 것처럼 보입니다. -전적으로 우연이며 데이터 생성 프로세스를 설명하는 "실제"를 반영하지 않습니다.)
대역폭을 변경하는 것이 유익합니다. 너무 작 으면 소프트웨어가 특이점에 대해 불평합니다. (이 베어 본 구현에서는 오류 검사를 작성하지 않았습니다.) 그러나 1에서 1/4로 줄이고 이전과 동일한 데이터를 사용하면 흥미로운 결과가 나타납니다.
경계 주변의 점이 비정상적으로 큰 주 고유 값 (왼쪽 위지도의 녹색 위치에 표시됨)을 제공하는 경향이있는 반면, 다른 모든 고유 값은 보정하기 위해 눌려져 있습니다 (다른 세 맵의 연 분홍색으로 표시됨) . 이러한 현상과 PCA 및 지리적 가중치의 다른 많은 미묘한 점은 지리적으로 가중치가 부여 된 PCA 버전을 안정적으로 해석하기 전에 이해해야합니다. 그리고 고려해야 할 다른 30 * 30 = 900 고유 벡터 (또는 "부하")가 있습니다 ....