이 질문은 변수들 사이의 "기본 [선형] 관계 식별"에 대해 묻습니다.
관계 를 감지 하는 빠르고 쉬운 방법 은 자주 사용하는 소프트웨어를 사용하여 해당 변수에 대해 다른 변수를 일정하게 사용하는 것입니다. (회귀 결과를 보더라도 귀찮게하지 않을 것입니다. 우리는 회귀 행렬을 설정하고 분석하는 데 유용한 부작용에 의존하고 있습니다.)
0
(“작은”하중이 무엇인지 식별하는 것과 관련된 기술과 상당히 많은 문헌이 있습니다. 종속 변수를 모델링하려면 구성 요소를 식별하기 위해 PCA의 독립 변수에 포함시키는 것이 좋습니다. 종속 변수가 중요한 역할을하는 크기 (이러한 관점에서 "작은"은 그러한 구성 요소보다 훨씬 작다는 의미입니다.)
몇 가지 예를 살펴 보겠습니다. (이 R
계산 및 플로팅에 사용합니다.) PCA를 수행하고 작은 구성 요소를 찾고 구성하며 이들 간의 선형 관계를 리턴하는 함수로 시작하십시오.
pca <- function(x, threshold, ...) {
fit <- princomp(x)
#
# Compute the relations among "small" components.
#
if(missing(threshold)) threshold <- max(fit$sdev) / ncol(x)
i <- which(fit$sdev < threshold)
relations <- fit$loadings[, i, drop=FALSE]
relations <- round(t(t(relations) / apply(relations, 2, max)), digits=2)
#
# Plot the loadings, highlighting those for the small components.
#
matplot(x, pch=1, cex=.8, col="Gray", xlab="Observation", ylab="Value", ...)
suppressWarnings(matplot(x %*% relations, pch=19, col="#e0404080", add=TRUE))
return(t(relations))
}
B , C, D ,이자형에이
process <- function(z, beta, sd, ...) {
x <- z %*% beta; colnames(x) <- "A"
pca(cbind(x, z + rnorm(length(x), sd=sd)), ...)
}
B , … , EA=B+C+D+EA=B+(C+D)/2+Esweep
n.obs <- 80 # Number of cases
n.vars <- 4 # Number of independent variables
set.seed(17)
z <- matrix(rnorm(n.obs*(n.vars)), ncol=n.vars)
z.mean <- apply(z, 2, mean)
z <- sweep(z, 2, z.mean)
colnames(z) <- c("B","C","D","E") # Optional; modify to match `n.vars` in length
B,…,EA
왼쪽 상단 패널과 관련된 출력은
A B C D E
Comp.5 1 -1 -1 -1 -1
00≈A−B−C−D−E
상단 중간 패널의 출력은
A B C D E
Comp.5 1 -0.95 -1.03 -0.98 -1.02
(A,B,C,D,E)
A B C D E
Comp.5 1 -1.33 -0.77 -0.74 -1.07
A′=B′+C′+D′+E′
1,1/2,1/2,1
실제로, 하나의 변수가 다른 변수의 명백한 조합으로 분류되는 경우는 종종 없습니다. 모든 계수는 크기가 다양하고 부호가 다를 수 있습니다. 또한 관계의 차원이 둘 이상인 경우 관계를 지정하는 고유 한 방법이 없습니다. 이러한 관계에 대한 유용한 기초를 식별하려면 추가 분석 (예 : 행 축소)이 필요합니다. 그것이 세상이 작동하는 방식입니다. PCA가 출력 하는 이러한 특정 조합은 데이터의 변화와 거의 일치하지 않는다는 것입니다. 이에 대처하기 위해, 어떤 사람들은 어떤 형태를 취하더라도 회귀 분석 또는 후속 분석에서 가장 큰 ( "주체") 성분을 독립 변수로 직접 사용합니다. 이를 수행하는 경우 먼저 변수 세트에서 종속 변수를 제거하고 PCA를 다시 실행하는 것을 잊지 마십시오!
이 그림을 재현하는 코드는 다음과 같습니다.
par(mfrow=c(2,3))
beta <- c(1,1,1,1) # Also can be a matrix with `n.obs` rows: try it!
process(z, beta, sd=0, main="A=B+C+D+E; No error")
process(z, beta, sd=1/10, main="A=B+C+D+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+C+D+E; Large error")
beta <- c(1,1/2,1/2,1)
process(z, beta, sd=0, main="A=B+(C+D)/2+E; No error")
process(z, beta, sd=1/10, main="A=B+(C+D)/2+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+(C+D)/2+E; Large error")
(단일 구성 요소 만 표시하기 위해 큰 오류의 경우 임계 값을 조정해야했습니다 process
. 이 값을에 매개 변수로 제공하는 이유입니다 .)
사용자 ttnphns는 밀접하게 관련된 스레드에 관심을 기울였습니다. JM의 답변 중 하나가 여기에 설명 된 접근 방식을 제안합니다.