การคำนวณตัวแปรคอนทราสต์พหุนาม


11

โปรดให้ฉันทราบวิธีการ recode ตัวแปรเด็ดขาด (ปัจจัย) อย่างมีประสิทธิภาพในชุดของตัวแปรความแตกต่างของพหุนาม orthogonal

สำหรับตัวแปรความคมชัดหลายประเภท (เช่นส่วนเบี่ยงเบนง่ายเฮลเมอร์ ฯลฯ ) การผ่านคือ:

  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

@ อันโตขอบคุณ จุดมุ่งหมายของฉันคือการสามารถรหัส (ใน SPSS โดยไวยากรณ์) เป็นไปได้หรือไม่ที่จะคิดว่าฟังก์ชั่นที่คุณพูดถึงทำงานอย่างไร
ttnphns

คำตอบ:


5

ตามที่โพสต์ก่อนหน้าของฉันในหัวข้อนี้ฉันต้องการแบ่งปันบางอย่างชั่วคราว (แม้ว่าไม่สมบูรณ์) สำรวจของฟังก์ชั่นที่อยู่เบื้องหลังพีชคณิตเชิงเส้นและฟังก์ชั่น R ที่เกี่ยวข้อง นี่ควรจะเป็นงานที่กำลังดำเนินอยู่

ส่วนหนึ่งของความโปร่งแสงของฟังก์ชั่นเกี่ยวข้องกับรูปแบบ "กะทัดรัด" ของการสลายตัวของเจ้าของบ้านแนวคิดที่อยู่เบื้องหลังการสลายตัวของเจ้าของบ้านคือการสะท้อนเวกเตอร์ข้ามไฮเปอร์เพลนที่กำหนดโดยหน่วย - เวกเตอร์ดังในแผนภาพด้านล่าง แต่เลือกระนาบนี้ด้วยวิธีที่มีวัตถุประสงค์เพื่อฉายเวกเตอร์ทุกคอลัมน์ของเมทริกซ์ดั้งเดิมไปยังเวกเตอร์หน่วยมาตรฐาน ให้เป็นมาตรฐานบรรทัดฐาน-2เวกเตอร์สามารถใช้ในการคำนวณการเปลี่ยนแปลงเจ้าของบ้านที่แตกต่างกันx}u A e 1 1 u I - 2QRuAe11uI2uuTx

ป้อนคำอธิบายรูปภาพที่นี่

การฉายผลลัพธ์สามารถแสดงเป็น

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

เวกเตอร์แสดงให้เห็นถึงความแตกต่างระหว่างคอลัมน์เวกเตอร์ในเมทริกซ์ที่เราต้องการในการย่อยสลายและเวกเตอร์สอดคล้องกับการสะท้อนข้ามสเปซหรือ "กระจก" กำหนดโดยยูvxAyu

วิธีการที่ใช้โดย LAPACK ปล่อยความจำเป็นในการจัดเก็บข้อมูลของรายการแรกในการสะท้อนแสงคฤหัสถ์ด้วยการเปลี่ยนเป็น 's แทนที่จะทำให้เวกเตอร์เป็นด้วยมันเป็นเพียงรายการกำปั้นที่ถูกแปลงเป็น ; แต่เวกเตอร์ใหม่เหล่านี้ - เรียกพวกมันว่ายังสามารถใช้เป็นเวกเตอร์บอกทิศทางได้1vuu=11w

ความสวยงามของวิธีการคือเมื่อ ในการสลายตัวของเป็นรูปสามเหลี่ยมด้านบนเราสามารถใช้ประโยชน์จากองค์ประกอบในใต้เส้นทแยงมุมเพื่อเติมเต็มด้วยตัวสะท้อนแสงเหล่านี้ โชคดีที่รายการชั้นนำในเวกเตอร์เหล่านี้มีค่าเท่ากัน , ป้องกันปัญหาในแนวทแยง "โต้แย้ง" ของเมทริกซ์: เมื่อรู้ว่าพวกเขาเป็นทั้งหมดพวกเขาไม่จำเป็นต้องรวมและสามารถให้เส้นทแยงมุมกับรายการของRRQR0Rw11R

เมทริกซ์ "compact QR" ในฟังก์ชั่นqr()$qrสามารถเข้าใจได้โดยคร่าวๆคือการเพิ่ม matrix และเมทริกซ์ "storage" สามเหลี่ยมที่ต่ำกว่าสำหรับตัวสะท้อน "แก้ไข"R

การประมาณการเจ้าของบ้านจะยังคงมีรูปแบบแต่เราจะไม่ทำงานกับ ( ) แต่แทนที่จะเป็นเวกเตอร์ซึ่งรายการแรกเท่านั้นที่จะได้รับการรับรองว่าเป็นและI2uuTxux=1w1

(1)I2uuTx=I2wwwTwx=I2wwTw2x{1}

ใครจะคิดว่ามันคงเป็นเรื่องปกติที่จะเก็บตัวสะท้อนแสงใต้เส้นทแยงมุมหรือไม่รวมรายการแรกของและเรียกมันว่าวัน อย่างไรก็ตามสิ่งที่ไม่เคยง่าย แต่สิ่งที่ถูกเก็บไว้ใต้เส้นทแยงมุมคือการรวมกันของและสัมประสิทธิ์ในการเปลี่ยนแปลงเจ้าของบ้านที่แสดงเป็น (1) เช่นนั้นกำหนด เป็น:wR1qr()$qrwtau

τ=wTw2=w2 , ตัวสะท้อนแสงสามารถแสดงเป็นw เวกเตอร์ "ตัวสะท้อน" เหล่านี้เป็นตัวที่ถูกเก็บไว้ภายใต้ในสิ่งที่เรียกว่า "compact "reflectors=w/τRQR

ตอนนี้เราอยู่ห่างจากเวกเตอร์หนึ่งองศาและรายการแรกไม่ใช่อีกต่อไปดังนั้นผลลัพธ์ของจะต้องรวมคีย์เพื่อเรียกคืนเนื่องจากเรายืนยันว่าไม่รวมรายการแรกของ "ตัวสะท้อน" เพื่อ พอดีทุกอย่างค่ะ แล้วเราเห็นค่าในผลลัพธ์หรือไม่ ก็ไม่สามารถคาดเดาได้ ในผลลัพธ์ของ(ที่เก็บคีย์นี้) เราพบ .w1qr()qr()$qrτqr()$qrauxρ=reflectors22=wTwτ2/2

ดังนั้นกรอบสีแดงด้านล่างเราจะเห็น "ตัวสะท้อนแสง" ( ) ไม่รวมรายการแรกw/τ

ป้อนคำอธิบายรูปภาพที่นี่

รหัสทั้งหมดอยู่ที่นี่แต่เนื่องจากคำตอบนี้เกี่ยวกับจุดตัดของการเข้ารหัสและพีชคณิตเชิงเส้นฉันจะวางผลลัพธ์เพื่อความสะดวก:


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

ลองเปรียบเทียบ ouput กับฟังก์ชั่นในตัว 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 (หรือฉันผิด?) ดังนั้นหากเป้าหมายคือการเขียนโค้ดบางอย่างใน SPSS ที่เกี่ยวข้องกับ QR ไม่จำเป็นต้องใช้อัลกอริทึม QR ด้วยตนเอง
อะมีบา

@amoeba ขอบคุณ เนื่องจากเราอยู่คนเดียวให้ฉันวางใจในคุณ: ผู้เขียน OP ไม่ต้องการความช่วยเหลือใด ๆ จากฉัน แต่ฉันเอาความคิดเห็นของเขา (ด้านบน) เกี่ยวกับผลงานภายในของ (โดยเฉพาะ) ฟังก์ชั่น R ที่ฉันใช้ในโพสต์ร่วม ในฐานะที่เป็นความสนุกส่วนบุคคลเพราะมันทำให้ฉันรู้ว่าฉันเข้าใจการใช้ตัวแยกประเภทของ QR ตัวประกอบในฟังก์ชัน R เพียงเล็กน้อยเท่านั้น เนื่องจากเป็นเรื่องยากสำหรับฉันที่จะค้นหาการอ้างอิงที่ดีหรือได้รับคำตอบใด ๆ ที่สร้างความแตกต่างจากการถามทางออนไลน์ฉันจึงโพสต์สิ่งที่ฉันได้รับหลังจากความพยายามมากกว่าที่ฉันยอมรับ
Antoni Parellada
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.