Вычисление полиномиальных контрастных переменных


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мой пост. Мне действительно интересно, могу ли я сказать что-то другое, чтобы ответить на ваш вопрос без дублирования. Я действительно не хочу делать плохую работу ... Я прочитал достаточно ваших постов, чтобы иметь большое уважение к вам ... Если я найду способ выразить концепцию без кода, просто концептуально через линейную алгебру, Я вернусь к этому. Я счастлив, однако, что вы нашли мое исследование вопроса какой-то ценности. С наилучшими пожеланиями, Тони.
Антони Пареллада

@ Антони, спасибо. Моя цель состоит в том, чтобы иметь возможность кодировать его (в SPSS, по его синтаксису). Можно ли выяснить, как работают упомянутые вами функции?
ttnphns

Ответы:


5

В продолжение моего предыдущего поста по этой теме я хочу поделиться некоторым предварительным (хотя и неполным) исследованием функций, лежащих в основе линейной алгебры и связанных с ней R-функций. Это должно быть работа в процессе.

Часть непрозрачности функций связана с «компактной» формой разложения 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

Проекция «Домохозяин» по-прежнему будет иметь вид , но мы не будем работать с ( ), а скорее с вектором , из которых гарантируется, что только первая запись равна , иI2uuTxux=1w1

(1)I2uuTx=I2wwwTwx=I2wwTw2x .

Можно предположить, что было бы хорошо хранить эти отражатели ниже диагонали или исключая первую запись , и называть это днем. Тем не менее, все не так просто. Вместо этого ниже диагонали находится комбинация и коэффициентов в преобразовании Домохозяина, выраженных как (1), так что определение определяется как:wR1qr()$qrwtau

τ=wTw2=w2 , отражатели могут быть выражены как . Эти векторы «отражателя» хранятся прямо под в так называемом «компактном ».reflectors=w/τRQR

Теперь мы находимся на один градус от векторов , и первая запись больше не равна , следовательно, вывод должен включать ключ для их восстановления, поскольку мы настаиваем на исключении первой записи векторов «отражателя» в подходит всем . Итак, мы видим значения в выводе? Ну, нет, это было бы предсказуемо. Вместо этого в выводе (где хранится этот ключ) мы находим .1 τ ρ = отражатели 2w1qr()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 Спасибо. Поскольку мы одни, позвольте мне вам доверять: автору OP не нужна моя помощь, но я взял его комментарий (выше) о внутренней работе (в частности) функций R, которые я использовал в сопутствующем сообщении как личный забавный вызов, потому что он заставил меня понять, как мало я понимал эти реализации QR-факторизации, встроенные в функции R. Поскольку мне было невероятно сложно найти какие-либо хорошие ссылки или получить какие-либо ответы, которые действительно имели значение, задавая вопрос в Интернете, я публикую то, что получил, приложив больше усилий, чем могу себе позволить.
Антони Пареллада
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.