Polinom kontrast değişkenlerinin hesaplanması


11

Lütfen kategorik bir değişkeni (faktörü) dikey polinom kontrast değişkenleri kümesine nasıl verimli bir şekilde yeniden kodlayacağımı düşünün.

Birçok kontrast değişkeni türü için (örn. Sapma, basit, Helmert, vb.) Geçiş:

  1. Kontrast katsayısı matrisi türüne karşılık gelir.
  2. Kod matrisini elde etmek için ters veya genelleştirerek ters çevirin.

Örneğin:

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

Polinom kontrast değişkenlerini elde etmenin aynı veya benzer bir yolu var mı? Eğer evetse C matrisi nasıl görünür ve nasıl oluşturulur? Hala hayır ise , polinom kontrast değişkenlerini etkili bir şekilde hesaplamanın yolu yoktur (örn. Matris cebiri ile).


1
(Bu arada) sonuçlarımın ardından yaptığım qr.qy()manuel hesaplamaları kabul ettiğimi doğruladıktan sonra sorunuza baktım . Sorunuzu çoğaltmadan cevaplamak için farklı bir şey söyleyebilir miyim gerçekten merak ediyorum. Gerçekten kötü bir iş yapmak istemiyorum ... Yazılarınızı size çok fazla saygı gösterecek kadar okudum ... Kavramı kod olmadan ifade etmenin bir yolunu bulursam, sadece kavramsal olarak cebir yoluyla, Ben ona geri döneceğim. Yine de, bir değer meselesini araştırdığımı bulduğunuz için mutluyum. En iyi dileklerimle, Toni. qr.Q(qr(X))Q%*%z
Antoni Parellada

@Antoni, teşekkür ederim. Amacım (SPSS'de sözdizimi ile) kodlayabilmek. Bahsettiğiniz işlevlerin nasıl çalıştığını anlamak mümkün müdür?
ttnphns

Yanıtlar:


5

Bu konuyla ilgili önceki yazıma bir selam olarak , doğrusal cebirin ve ilgili R fonksiyonlarının arkasındaki fonksiyonların bazı belirsiz (eksik olsa da) keşfini paylaşmak istiyorum. Bunun devam eden bir çalışma olması gerekiyordu.

Fonksiyonların opaklığının bir kısmı, Hanehalkı ayrışmasının "kompakt" formu ile ilgilidir . Hanehalkı ayrışmasının ardındaki fikir, vektörleri aşağıdaki şemada olduğu gibi bir unit-vector tarafından belirlenen bir hiper düzlem boyunca yansıtmak , ancak bu düzlemi orijinal matrisin her sütun vektörünü yansıtmak için maksatlı bir şekilde üzerine standart birim vektörü. Normalize edilmiş norm-2 vektörüu A e 1 1 uQRuAe11u Farklı Hanehalkı dönüşümlerini I - 2 hesaplamak için kullanılabilir .I2uuTx

resim açıklamasını buraya girin

Ortaya çıkan projeksiyon şu şekilde ifade edilebilir:

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

vektörü , ayrıştırmak istediğimiz matrisindeki sütun vektörleri ile tarafından belirlenen "ayna" yansımasına karşılık gelen vektörleri arasındaki farkı temsil eder .vxAyu

LAPACK tarafından kullanılan yöntem, ilk girişin Hanehalkı reflektörlerinde 'e dönüştürülerek depolanması ihtiyacını ortadan kaldırır . Bunun yerine vektör normalleştirme için ile , bir dönüştürülür sadece yumruk giriştir ; yine de, bu yeni vektörler - onlara yine de yönlü vektörler olarak kullanılabilir.1vuu=11w

Yöntemin güzelliği, bir ayrışmasında üst üçgen olması nedeniyle, bu reflektörlerle doldurmak için çaprazın altındaki öğeden gerçekten faydalanabiliriz . Neyse ki, bu vektörlerdeki öncü girişlerin hepsi eşittir, bu da matrisin "tartışmalı" diyagonalinde bir problemi önler: hepsinin olduklarını bilmek, dahil edilmeleri gerekmez ve .RQR0Rw11R

Fonksiyondaki "kompakt QR" matrisi qr()$qrkabaca " matrisinin ve" değiştirilmiş "reflektörler için alt üçgen" depolama "matrisinin eklenmesi olarak anlaşılabilir .R

Hanehalkı projeksiyonu hala biçiminde olacaktır, ancak ( ) ile değil, bir vektörle , bunlardan sadece ilk girişi olacak şekilde garantilidir veI2uuTxux=1w1

(1)I2uuTx=I2wwwTwx=I2wwTw2x .

Bu reflektörleri , ilk girişi hariç olmak üzere diyagonal veya altında saklamanın ve bir gün olarak adlandırmanın iyi olacağını varsayabiliriz . Ancak işler hiç bu kadar kolay olmamıştı. Bunun yerine, diyagonalin altında depolanan , ile Hanehalkı dönüşümündeki katsayıların (1) olarak ifade edildiği şekilde, şöyle tanımlanır:wR1qr()$qrwtau

τ=wTw2=w2 , yansıtıcılar olarak ifade edilebilir . Bu "reflektör" vektörler, "compact " olarak adlandırılan altında saklananlardır .reflectors=w/τRQR

Şimdi vektörlerinden bir derece uzaktayız ve ilk giriş artık , Bu nedenle , "reflektör" vektörlerinin ilk girişini hariç tutmakta ısrar ettiğimiz için çıktılarını geri yüklemek için anahtarı içermesi gerekecek. herşeyi sığdır . Çıktıda değerlerini görüyor muyuz ? Hayır, bu tahmin edilebilir. Bunun yerine (bu anahtarın depolandığı yerde) .w1qr()qr()$qrτqr()$qrauxρ=reflectors22=wTwτ2/2

Aşağıda kırmızıyla çerçevelenmiş olarak , ilk girişleri hariç "reflektörleri" ( ) görüyoruz .w/τ

resim açıklamasını buraya girin

Tüm kod burada , ancak bu cevap kodlama ve lineer cebirin kesişimi hakkında olduğundan, çıktıyı kolaylıkla yapıştıracağım:


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

Şimdi işlevi House()şöyle yazdım :

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

Çıkışı R yerleşik işlevleriyle karşılaştıralım. İlk olarak ev yapımı fonksiyon:

(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 fonksiyonlarına:

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 ama sanırım SPSS, QR ayrışması için fonksiyonlar inşa etti (ya da yanlış mıyım?), Bu nedenle amaç QR içeren SPSS'de bir şeyi kodlamaksa, QR algoritmasını manuel olarak uygulamaya gerek yoktur.
amip

@amoeba Teşekkür ederim. Yalnız olduğumuzdan, size güvenmeme izin verin: OP'nin yazarı benden herhangi bir yardıma ihtiyaç duymuyor, ancak (özellikle) eşlik görevinde kullandığım R işlevlerinin iç çalışması hakkında (yukarıda) yorumunu aldım. kişisel eğlenceli bir meydan okuma olarak, çünkü bu QR çarpanlarına ayırma uygulamalarını R fonksiyonlarına yerleştirdiğimi ne kadar az anlamadığımı anlamamı sağladı. İyi referanslar bulmak ya da çevrimiçi olarak fark yaratan herhangi bir cevap almak benim için inanılmaz derecede zor olduğu için, itiraf ettiğimden daha fazla çaba sarf ettikten sonra ne aldığımı gönderiyorum.
Antoni Parellada
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.