Tính toán các biến tương phản đa thức


11

Xin vui lòng cho tôi biết làm thế nào để mã hóa lại một cách hiệu quả một biến phân loại (yếu tố) thành tập hợp các biến tương phản đa thức trực giao.

Đối với nhiều loại biến tương phản (ví dụ độ lệch, đơn giản, Helmert, v.v.), pass là:

  1. Soạn ma trận hệ số tương phản tương ứng với loại.
  2. Nghịch đảo hoặc tổng quát hóa nó để có được ma trận mã.

Ví dụ:

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ó cách tương tự hoặc tương tự để có được các biến tương phản đa thức? Nếu có, ma trận C sẽ như thế nào và làm thế nào để soạn nó? Nếu không có gì vẫn cách tính các biến tương phản đa thức một cách hiệu quả (ví dụ: bằng đại số ma trận).


1
Tôi đã xem xét câu hỏi của bạn sau khi xác minh (tình cờ) rằng kết quả qr.qy()đồng ý với các tính toán thủ công qr.Q(qr(X))theo sau Q%*%ztrên bài đăng của tôi. Tôi thực sự tự hỏi nếu tôi có thể nói bất cứ điều gì khác nhau để trả lời câu hỏi của bạn mà không trùng lặp. Tôi thực sự không muốn làm một công việc tồi tệ ... Tôi đã đọc đủ các bài đăng của bạn để có nhiều sự tôn trọng dành cho bạn ... Nếu tôi tìm cách thể hiện khái niệm mà không cần mã, chỉ cần khái niệm thông qua đại số tuyến tính, Tôi sẽ trở lại với nó. Mặc dù vậy, tôi rất vui vì bạn đã tìm thấy sự khám phá của tôi về vấn đề giá trị nào đó. Lời chúc tốt đẹp nhất, Toni.
Antoni Parellada

@Antoni, cảm ơn bạn. Mục đích của tôi là có thể mã hóa nó (trong SPSS, theo cú pháp của nó). Có thể tìm ra làm thế nào các chức năng bạn đề cập làm việc?
ttnphns

Câu trả lời:


5

Như một sự khác biệt với bài viết trước của tôi về chủ đề này, tôi muốn chia sẻ một số khám phá dự kiến ​​(mặc dù chưa hoàn chỉnh) về các hàm đằng sau đại số tuyến tính và các hàm R liên quan. Đây được cho là một công việc đang tiến triển.

QRuAe11uI2uuTx

nhập mô tả hình ảnh ở đây

Phép chiếu kết quả có thể được biểu thị bằng

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

vxAyu

1vuu=11w

RQR0Rw11R

qr()$qrR

I2uuTxux=1w1

(1)I2uuTx=I2wwwTwx=I2wwTw2x

wR1qr()$qrwtau

τ=wTw2=w2reflectors=w/τRQR

w1qr()qr()$qrτqr()$qrauxρ=reflectors22=wTwτ2/2

w/τ

nhập mô tả hình ảnh ở đây

Tất cả các mã đều ở đây , nhưng vì câu trả lời này là về giao điểm của mã hóa và đại số tuyến tính, tôi sẽ dán đầu ra cho dễ:


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

Bây giờ tôi đã viết chức năng House()như sau:

   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)
}

Chúng ta hãy so sánh ouput với các hàm tích hợp R. Đầu tiên là chức năng tự làm:

(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

đến các hàm 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 nhưng tôi đoán rằng SPSS đã tích hợp sẵn các chức năng phân tách QR (hoặc tôi có sai không?), Vì vậy, nếu mục đích là mã hóa một cái gì đó trong SPSS liên quan đến QR thì hầu như không cần phải thực hiện thuật toán QR theo cách thủ công.
amip nói rằng Phục hồi lại

@amoeba Cảm ơn bạn. Vì chúng tôi chỉ có một mình, hãy để tôi tâm sự với bạn: Tác giả của OP không cần tôi giúp đỡ, nhưng tôi đã nhận xét của anh ấy (ở trên) về hoạt động bên trong của (cụ thể) các chức năng R mà tôi đã sử dụng trong bài đăng đồng hành như một thử thách thú vị cá nhân, bởi vì nó khiến tôi nhận ra rằng tôi hiểu rất ít những triển khai nhân tố QR này được tích hợp trong các chức năng R. Vì rất khó để tôi tìm thấy bất kỳ tài liệu tham khảo tốt nào, hoặc nhận được bất kỳ câu trả lời nào thực sự tạo ra sự khác biệt bằng cách hỏi trực tuyến, tôi đang đăng những gì tôi nhận được sau nhiều nỗ lực hơn tôi quan tâm thừa nhận.
Antoni Parellada
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.