多項式対比変数の計算


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 Parellada 2016

@Antoni、ありがとう。私の目的は、それを(SPSSでは、その構文によって)コーディングできるようにすることです。あなたが言及した機能がどのように機能するかを理解することは可能ですか?
ttnphns

回答:


5

このトピックに関する私の以前の投稿のセグエとして、線形代数と関連するR関数の背後にある関数の(不完全ではありますが)暫定的な探索について共有したいと思います。これは進行中の作業になるはずです。

関数の不透明性の一部は、Householder 分解の「コンパクト」形式に関係しています。ハウスホルダ分解の背後にある考え方は、単位ベクトルによって決定超平面を横切るベクトルに反映することであるU下の図のように、しかし、元の行列の各列ベクトル突出するように意図的な方法で、この平面を選ぶAを上にE 1標準単位ベクトル。正規化されたノルム-2 1ベクトルuを使用して、さまざまなハウスホルダー変換I 2を計算できます。QRあなたe11あなた2あなたあなたTバツ

ここに画像の説明を入力してください

結果の投影は次のように表すことができます

符号バツ=バツ1×バツ[1000]+[バツ1バツ2バツバツメートル]

ベクトルは、分解する行列の列ベクトルと、によって決定される部分空間または「ミラー」全体の反射に対応するベクトル間の差を表します。x A y uvバツyあなた

LAPACKで使用される方法では、ハウスホルダーリフレクターの最初のエントリーを変換することで、ストレージの必要性を解放します。代わりに、ベクトル正規のすると、それが変換されるだけ拳エントリである。まだ、これらの新しいベクトル-それらをと呼んでも、方向ベクトルとして使用できます。V U U = 1 1 wの1vあなたあなた=11w

この方法の美しさは、その与えられたことをされた で分解が上三角で、我々は実際の利点を取ることができますの要素これらとでそれらを埋めるために、対角以下リフレクター。ありがたいことに、これらのベクトルの先頭のエントリはすべてに等しく、行列の「論争のある」対角線の問題を回避します。これらがすべてあることを知っていれば、含める必要はなく、のエントリの対角線を生成できます。。Q R 0 R w 1 1 RRQR0Rw11R

関数内の「コンパクトQR」行列は、qr()$qr大まかに行列と「変更された」リフレクターの下三角の「ストレージ」行列の追加として理解できます。R

世帯主の予測は、依然としてI - 2の形式が、我々はで作業することはできません UX = 1)、むしろベクターと Wのみ最初のエントリがあるとguanteedされた、 1、及び2あなたあなたTバツあなたバツ=1w1

(1)2あなたあなたTバツ=2wwwTwバツ=2wwTw2バツ

wR1qr()$qrwタウ

τ=wTw2=w2リフレクター=w/τRQR

w1qr()qr()$qrτqr()$qrauxρ=Σリフレクター22=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関数の内部動作について彼のコメントを取りました(上) R関数に組み込まれたQR分解のこれらの実装をほとんど理解していないことに気づいたので、個人的な楽しみの課題として。良い参考文献を見つけたり、オンラインで質問して本当に違いを生んだりする答えを得るのは信じられないほど困難だったので、私は認めようとする以上の努力の結果得たものを投稿しています。
Antoni Parellada 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.