多项式对比变量的计算


11

请让我知道如何有效地将分类变量(因子)重新编码为正交多项式对比变量的集合。

对于许多类型的对比变量(例如,偏差,简单,Helmert等),通过是:

  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'4

@安东尼,谢谢。我的目标是能够对其进行编码(按SPSS语法)。是否有可能弄清楚您提到的功能如何工作?
ttnphns

Answers:


5

作为我之前关于该主题的帖子的主题,我想对线性代数和相关的R函数背后的函数进行一些初步(尽管不完整)的探索。这应该是正在进行的工作。

QRuAe11uI2uuTx

在此处输入图片说明

结果投影可以表示为

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

向量表示我们要分解的矩阵中的列向量与对应于确定的子空间或“镜像”反射的向量之间的差。vxAyu

LAPACK所使用的方法通过将第一项存储在Householder反射器中而将它们变为,从而解放了它们。而不是使用将向量标准化为,只是将第一项转换为。然而,这些新的向量-称为仍可以用作方向向量。1vuu=11w

该方法的优点是,鉴于 在分解是上三角,我们实际上可以采取的优点中的元素下面对角线填充它们与这些反射器。幸运的是,这些向量中的前导项都等于,从而防止了矩阵“有争议的”对角线出现问题:知道它们全为,就不需要将其包括在内,并且可以将的对角线生成。RQR0Rw11R

函数中的“紧凑QR”矩阵qr()$qr可以大致理解为矩阵和“修改”反射器的下部三角形“存储”矩阵的加法。R

Householder投影将仍然具有,但是我们不会使用(),而是使用向量,其中只有第一个条目被注释为,并且I2uuTxux=1w1

(1)I2uuTx=I2wwwTwx=I2wwTw2x

可以假设将这些反射器存储在对角线或下方(不包括第一个项,然后将其命名为day就可以了。但是,事情从未如此简单。相反,存储在对角线下方的是和Householderer变换中表示为(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算法。
变形虫说莫妮卡(Monica)恢复

@amoeba谢谢。既然我们是孤身一人,请允许我向您倾诉:OP的作者不需要我任何帮助,但是我(在上面)对我在配套文章中使用的R函数的内部工作方式(特别是我)持评论意见。作为一项个人娱乐挑战,因为这使我意识到我几乎不了解R函数中内置的QR因式分解的这些实现。由于我很难找到任何好的参考资料,或者很难通过在线提问获得真正有帮助的答案,因此,我发布的内容比我愿意承认的要多。
Antoni Parellada
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.