Розрахунок поліноміальних контрастних змінних


11

Будь ласка, дайте мені уявлення про те, як ефективно переконувати категоричну змінну (фактор) у набір ортогональних контрастних змінних поліном.

Для багатьох типів змінних контрастів (наприклад, відхилення, проста, Гельмерта тощо) пропуск:

  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, дякую Моя мета - вміти його кодувати (у SPSS, за його синтаксисом). Чи можливо розібратися, як працюють згадані вами функції?
ttnphns

Відповіді:


5

Як моє попереднє повідомлення на цю тему, я хочу поділитися деяким попереднім (хоч і неповним) дослідженням функцій лінійної алгебри та пов'язаних з ними R функцій. Це, як передбачається, незавершене виробництво.

Частина непрозорості функцій пов'язана з "компактною" формою розкладання Householder . Ідея декомпозиції Householder полягає у відображенні векторів по гіперплані, визначеній одиницею-вектором як на наведеній нижче схемі, але вибір цієї площини цілеспрямовано, щоб спроектувати кожен вектор стовпця оригінальної матриці на вектор стандартної одиниці. Нормована норма-2 вектор може бути використана для обчислення різних перетворень .u A e 1 1 u I - 2QRuAe11uI2uuTx

введіть тут опис зображення

Отримана проекція може бути виражена як

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

Вектор являє собою різницю між векторами стовпців в матриці яку ми хочемо розкласти, і векторами відповідають відображенню по підпросторі або "дзеркалу", визначеному .vxAyu

Метод, який використовує LAPACK, звільняє необхідність зберігання першого запису у відбивачах Householder, перетворюючи їх на -е. Замість того, щоб нормалізувати вектор до з , це просто запис кулака, який перетворюється на ; але ці нові вектори - називайте їх все ще можуть використовуватися як вектори спрямованості.1vuu=11w

Краса методу полягає в тому, що, враховуючи, що в розкладі верхній трикутний, ми можемо фактично скористатися елементами в нижче діагоналі, щоб заповнити їх цими відбивачами. На щастя, всі провідні записи в цих векторах рівні , що запобігає виникненню проблеми в "спірній" діагоналі матриці: знаючи, що вони всі їх не потрібно включати, і вони можуть дати діагональ записам .RQR0Rw11R

Матрицю "компактної QR" у функції qr()$qrможна розуміти як додавання матриці та нижньої трикутної матриці "зберігання" для "модифікованих" відбивачів.R

Проекція Householder буде мати форму , але ми не будемо працювати з ( ), а з вектором , з яких лише перший запис гарантується як , іI2uuTxux=1w1

(1)I2uuTx=I2wwwTwx=I2wwTw2x .

Можна припустити, що було б чудово зберігати ці відбивачі нижче діагоналі або виключаючи перший запис , і називати це день. Однак речі ніколи не бувають так просто. Натомість те, що зберігається нижче діагоналі, - це комбінація та коефіцієнтів перетворення Householder, виражених у вигляді (1), таких, що, визначаючи як:wR1qr()$qrwtau

τ=wTw2=w2 , рефлектори можуть бути виражені як . Ці "рефлекторні" вектори зберігаються прямо під у так званому "компактному ".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)
}

Порівняймо вихід з вбудованими функціями 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 Дякую Оскільки ми одні, дозвольте вам довіритись: автору ОП мені не потрібна допомога, але я взяв його коментар (вище) щодо внутрішніх функцій (конкретно) функцій R, які я використовував у попутнику як завдання особистого задоволення, тому що це змусило мене зрозуміти, як мало я розумію ці реалізації QR-факторизації, вбудовані у функції R. Оскільки мені було неймовірно важко знайти якісь хороші довідки або отримати відповіді, які насправді змінили питання, запитуючи в Інтернеті, я публікую те, що я отримав після більше зусиль, ніж я хочу визнати.
Антоні Пареллада
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.