다항식 대비 변수의 계산


11

범주 형 변수 (인수)를 직교 다항식 대비 변수 세트로 효율적으로 코딩하는 방법을 알려주십시오.

여러 유형의 대비 변수 (예 : 편차, 단순, Helmert 등)의 경우 패스는 다음과 같습니다.

  1. 대비 계수 행렬에 해당하는 형식을 구성하십시오.
  2. 코드 행렬을 얻기 위해 역 또는 일반화 역.

예를 들면 다음과 같습니다.

Suppose there is 3-group factor and we want to recode it into a set of deviation  contrast variables.
The last group is treated as reference. Then the contrast coefficients matrix L is

         Group1 Group2 Group3
   var1   2/3   -1/3   -1/3
   var2  -1/3    2/3   -1/3

and ginv(L) is then the sought-for coding matrix

         var1 var2
  Group1   1    0
  Group2   0    1
  Group3  -1   -1

(We might also use inv(L) instead if we add a row for constant, equal to 1/3, at the head of L.)

다항식 대비 변수를 얻는 것과 동일하거나 유사한 방법이 있습니까? 그렇다면 어떤 매트릭스 C가 보이고 어떻게 구성 하는가? 다항식 대비 변수를 효율적으로 계산하는 방법 여전히 없다면 (예 : 행렬 대수).


1
나는 결과가 (우연히) 확인 후 질문 보았다 qr.qy()의 수동 계산에 동의 qr.Q(qr(X))한 다음 Q%*%z내 게시물에. 중복없이 귀하의 질문에 대답하기 위해 다른 것을 말할 수 있는지 정말로 궁금합니다. 난 정말 나쁜 일을하고 싶지 않아 ... 난 당신을 존경 할만큼 충분히 글을 읽었 어 ... 개념적으로 선형 대수를 통해 다시 올게요 그러나 나는 당신이 어떤 가치의 문제에 대한 나의 탐구를 발견하게 된 것을 기쁘게 생각합니다. 소원, 토니
Antoni Parellada

@Antoni, 감사합니다. 내 목표는 (SPSS에서 구문으로) 코딩 할 수 있도록하는 것입니다. 언급 한 기능이 어떻게 작동하는지 알아낼 수 있습니까?
ttnphns

답변:


5

이 주제에 대한 나의 이전 포스트 의 전언으로 , 선형 대수 뒤의 함수와 관련 R 함수에 대한 잠정적 인 탐구 (완전하지는 않지만)를 공유하고 싶습니다. 이 작업은 진행 중입니다.

함수의 불투명도의 일부는 가정용 인 분해 의 "소형"형태와 관련이 있습니다. 가계 분해의 기본 개념은 아래 다이어그램에서와 같이 단위 벡터 의해 결정된 초평면을 가로 질러 벡터를 반영 하지만, 원래의 행렬 의 모든 열 벡터를 투영하도록 목적에 따라이 평면을 선택 에 표준 단위 벡터를. 정규화 된 norm-2 벡터 는 다른 가계 변환 변환 를 계산하는 데 사용될 수 있습니다 .u A e 1 1 u I 2QRuAe11uI2uuTx

여기에 이미지 설명을 입력하십시오

결과 투영은 다음과 같이 표현 될 수 있습니다

sign(xi=x1)×x[1000]+[x1x2x3xm]

벡터 는 우리가 분해하려는 행렬 의 열 벡터 와 의해 결정된 "공간"또는 "공간"에 대한 반사에 대응하는 벡터 사이의 차이를 나타냅니다 .vxAyu

LAPACK에서 사용하는 방법으로 돌려서 집주인 반사기의 첫 번째 항목의 저장을위한 필요성 해방 '들. 대신 벡터 정규화 에 와 , 그것으로 변환되기 바로 주먹 엔트리 인 ; 그러나 이러한 새로운 벡터는 라고 여전히 방향 벡터로 사용될 수 있습니다.1vuu=11w

이 방법의 장점은 분해 에서 이 상부 삼각형 이라는 것을 감안할 때 , 대각선 아래의 에서 요소 를 이용하여 이러한 반사기 로 채울 수 있다는 것입니다 . 다행히,이 벡터의 주요 항목 모두 동일 , 행렬의 "논쟁"대각선에서 문제를 방지 : 그들은 모든 것을 알고 가에 포함 할 필요가 없습니다, 그리고 항목에 대각선을 얻을 수 .RQR0Rw11R

함수의 "소형 QR"매트릭스 는 "수정 된"리플렉터 qr()$qr에 대한 매트릭스 및 하부 삼각 "스토리지"매트릭스 의 대략적인 추가로 이해 될 수 있습니다 .R

가계 계획은 여전히 이지만 ( )와 함께 작동하지 않고 벡터와 함께 작동합니다 첫 번째 엔트리가되고있는 guanteed가되어야 , 및I2uuTxux=1w1

(1)I2uuTx=I2wwwTwx=I2wwTw2x .

이 리플렉터를 대각선 또는 아래 에 의 첫 번째 항목을 제외하고 저장 하고 하루라고 부르는 것이 좋다고 가정합니다. 그러나 결코 쉬운 일이 아닙니다. 대신 대각선 아래에 저장되는 것은 와 (1)로 표현 된 가계 변환의 계수 의 조합으로 , 를 다음과 같이 정의 .wR1qr()$qrwtau

τ=wTw2=w2 이면 리플렉터는 로 표현 될 수 있습니다. . 이러한 "반사기"벡터는 소위 "compact " 에서 바로 아래에 저장된 것 입니다.reflectors=w/τRQR

이제 우리는 하나 명 정도의 거리에서없는 벡터, 첫 번째 항목은 더 이상 따라서의 출력, 우리는에 "반사"벡터의 첫 번째 항목을 제외한 주장 때문에 의지의 필요를 복원 키를 포함 에 모든 것을 맞습니다 . 출력에서 값을 볼 수 있습니까? 글쎄요, 그건 예측할 수 없습니다. 대신 (이 키가 저장된) 출력에서 .w1qr()qr()$qrτqr()$qrauxρ=reflectors22=wTwτ2/2

아래 빨간색 프레임으로 , 첫 번째 항목을 제외한 "반사기"( )가 표시됩니다.w/τ

여기에 이미지 설명을 입력하십시오

모든 코드는 here 이지만이 답변은 코딩과 선형 대수의 교차점에 관한 것이므로 출력을 쉽게 붙여 넣습니다.


options(scipen=999)
set.seed(13)
(X = matrix(c(rnorm(16)), nrow=4, byrow=F))
           [,1]      [,2]       [,3]       [,4]
[1,]  0.5543269 1.1425261 -0.3653828 -1.3609845
[2,] -0.2802719 0.4155261  1.1051443 -1.8560272
[3,]  1.7751634 1.2295066 -1.0935940 -0.4398554
[4,]  0.1873201 0.2366797  0.4618709 -0.1939469

이제 House()다음과 같이 함수 를 작성했습니다 .

   House = function(A){
    Q = diag(nrow(A))
    reflectors = matrix(0,nrow=nrow(A),ncol=ncol(A))
    for(r in 1:(nrow(A) - 1)){ 
        # We will apply Householder to progressively the columns in A, decreasing 1 element at a time.
        x = A[r:nrow(A), r] 
        # We now get the vector v, starting with first entry = norm-2 of x[i] times 1
        # The sign is to avoid computational issues
        first = (sign(x[1]) * sqrt(sum(x^2))) +  x[1]
        # We get the rest of v, which is x unchanged, since e1 = [1, 0, 0, ..., 0]
        # We go the the last column / row, hence the if statement:
        v = if(length(x) > 1){c(first, x[2:length(x)])}else{v = c(first)}
        # Now we make the first entry unitary:
        w = v/first
        # Tau will be used in the Householder transform, so here it goes:
        t = as.numeric(t(w)%*%w) / 2
        # And the "reflectors" are stored as in the R qr()$qr function:
        reflectors[r: nrow(A), r] = w/t
        # The Householder tranformation is:
        I = diag(length(r:nrow(A)))
        H.transf = I - 1/t * (w %*% t(w))
        H_i  = diag(nrow(A))
        H_i[r:nrow(A),r:ncol(A)] = H.transf
        # And we apply the Householder reflection - we left multiply the entire A or Q
        A = H_i %*% A
        Q = H_i %*% Q
    }
    DECOMPOSITION = list("Q"= t(Q), "R"= round(A,7), 
            "compact Q as in qr()$qr"=  
            ((A*upper.tri(A,diag=T))+(reflectors*lower.tri(reflectors,diag=F))), 
            "reflectors" = reflectors,
            "rho"=c(apply(reflectors[,1:(ncol(reflectors)- 1)], 2, 
                function(x) sum(x^2) / 2), A[nrow(A),ncol(A)]))
    return(DECOMPOSITION)
}

출력을 R 내장 함수와 비교해 봅시다. 먼저 집에서 만든 기능 :

(H = House(X))
$Q
            [,1]        [,2]       [,3]       [,4]
[1,] -0.29329367 -0.73996967  0.5382474  0.2769719
[2,]  0.14829152 -0.65124800 -0.5656093 -0.4837063
[3,] -0.93923665  0.13835611 -0.1947321 -0.2465187
[4,] -0.09911084 -0.09580458 -0.5936794  0.7928072

$R
          [,1]       [,2]       [,3]      [,4]
[1,] -1.890006 -1.4517318  1.2524151 0.5562856
[2,]  0.000000 -0.9686105 -0.6449056 2.1735456
[3,]  0.000000  0.0000000 -0.8829916 0.5180361
[4,]  0.000000  0.0000000  0.0000000 0.4754876

$`compact Q as in qr()$qr`
            [,1]        [,2]       [,3]      [,4]
[1,] -1.89000649 -1.45173183  1.2524151 0.5562856
[2,] -0.14829152 -0.96861050 -0.6449056 2.1735456
[3,]  0.93923665 -0.67574886 -0.8829916 0.5180361
[4,]  0.09911084  0.03909742  0.6235799 0.4754876

$reflectors
            [,1]        [,2]      [,3] [,4]
[1,]  1.29329367  0.00000000 0.0000000    0
[2,] -0.14829152  1.73609434 0.0000000    0
[3,]  0.93923665 -0.67574886 1.7817597    0
[4,]  0.09911084  0.03909742 0.6235799    0

$rho
[1] 1.2932937 1.7360943 1.7817597 0.4754876

R 함수에 :

qr.Q(qr(X))
            [,1]        [,2]       [,3]       [,4]
[1,] -0.29329367 -0.73996967  0.5382474  0.2769719
[2,]  0.14829152 -0.65124800 -0.5656093 -0.4837063
[3,] -0.93923665  0.13835611 -0.1947321 -0.2465187
[4,] -0.09911084 -0.09580458 -0.5936794  0.7928072

qr.R(qr(X))
          [,1]       [,2]       [,3]      [,4]
[1,] -1.890006 -1.4517318  1.2524151 0.5562856
[2,]  0.000000 -0.9686105 -0.6449056 2.1735456
[3,]  0.000000  0.0000000 -0.8829916 0.5180361
[4,]  0.000000  0.0000000  0.0000000 0.4754876

$qr
            [,1]        [,2]       [,3]      [,4]
[1,] -1.89000649 -1.45173183  1.2524151 0.5562856
[2,] -0.14829152 -0.96861050 -0.6449056 2.1735456
[3,]  0.93923665 -0.67574886 -0.8829916 0.5180361
[4,]  0.09911084  0.03909742  0.6235799 0.4754876

$qraux
[1] 1.2932937 1.7360943 1.7817597 0.4754876

+1 그러나 SPSS에는 QR 분해를위한 기능이 내장되어 있다고 생각합니다. (또는 잘못 되었습니까?) QR과 관련된 SPSS에서 무언가를 코딩하는 것이 QR 알고리즘을 수동으로 구현할 필요는 없습니다.
amoeba

@amoeba 감사합니다. 우리가 혼자 있기 때문에, 당신에게 말을하겠습니다. OP의 저자는 저의 도움이 필요하지 않지만, 나는 동료 포스트에서 사용한 R 함수 (특히)의 내부 작업에 대해 (위의) 의견을 얻었습니다. R 함수에 내장 된 QR 분해의 구현을 이해하는 것이 거의 없었기 때문에 개인적으로 재미있는 도전이었습니다. 좋은 참고 자료를 찾거나 온라인으로 질문하여 실제로 변화를 가져온 답변을 얻는 것이 매우 어려웠 기 때문에 인정하기보다 더 많은 노력을 기울인 결과를 게시하고 있습니다.
Antoni Parellada
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.