Veuillez me donner une idée de la façon de recoder efficacement une variable catégorielle (facteur) dans l'ensemble de variables de contraste polynomiales orthogonales.
Pour de nombreux types de variables de contraste (par exemple, déviation, simple, Helmert, etc.), la réussite est la suivante:
- Composez la matrice des coefficients de contraste correspondant au type.
- Inversez ou généralisez-l'inverse pour obtenir la matrice de codes.
Par exemple:
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.)
Existe-t-il la même méthode ou une méthode similaire pour obtenir des variables de contraste polynomiales? Si oui, à quoi ressemblerait la matrice C et comment la composer? Si non, quelle est encore la façon de calculer efficacement les variables de contraste polynomiales (par exemple par algèbre matricielle).
contrasts
polynomial
ttnphns
la source
la source
qr.qy()
sont en accord avec les calculs manuelsqr.Q(qr(X))
suivis deQ%*%z
sur mon post. Je me demande vraiment si je peux dire autre chose pour répondre à votre question sans double emploi. Je ne veux vraiment pas faire un mauvais travail ... J'ai lu suffisamment de vos articles pour avoir beaucoup de respect pour vous ... Si je trouve un moyen d'exprimer le concept sans code, juste conceptuellement à travers l'algèbre linéaire, J'y reviendrai. Je suis heureux, cependant, que vous ayez trouvé mon exploration de la question d'une certaine valeur. Meilleurs voeux, Toni.Réponses:
Comme enchaînement à mon post précédent sur ce sujet, je veux partager une exploration provisoire (quoique incomplète) des fonctions derrière l'algèbre linéaire et les fonctions R connexes. C'est censé être un travail en cours.
Une partie de l'opacité des fonctions est liée à la forme "compacte" de la décomposition Householder . L'idée derrière la décomposition du Householder est de refléter les vecteurs à travers un hyperplan déterminé par un vecteur-unité comme dans le diagramme ci-dessous, mais en choisissant ce plan de manière ciblée afin de projeter chaque vecteur de colonne de la matrice d'origine sur le vecteur d'unité standard . Le vecteur normalisé-2 normalisé peut être utilisé pour calculer les différentes transformations de Householder .u A e 1 1 u I - 2QR u A e1 1 u I−2uuTx
La projection résultante peut être exprimée comme
Le vecteur représente la différence entre les vecteurs colonne dans la matrice que nous voulons décomposer et les vecteurs correspondant à la réflexion à travers le sous-espace ou "miroir" déterminée par .v x A y u
La méthode utilisée par LAPACK libère le besoin de stockage de la première entrée dans les réflecteurs Householder en les transformant en . Au lieu de normaliser le vecteur en avec , c'est juste la première entrée qui est convertie en ; pourtant, ces nouveaux vecteurs - appelez-les peuvent toujours être utilisés comme vecteurs directionnels.1 v u ∥u∥=1 1 w
La beauté de la méthode est que, étant donné que dans une décomposition est triangulaire supérieur, nous pouvons réellement profiter des éléments dans sous la diagonale pour les remplir avec ces réflecteurs . Heureusement, les entrées principales de ces vecteurs sont toutes égales à , ce qui évite un problème dans la diagonale "contestée" de la matrice: sachant qu'elles sont toutes elles n'ont pas besoin d'être incluses et peuvent donner la diagonale aux entrées de .R QR 0 R w 1 1 R
La matrice "QR compacte" dans la fonctionR
qr()$qr
peut être comprise en gros comme l'addition de la matrice et de la matrice triangulaire "de stockage" inférieure pour les réflecteurs "modifiés".La projection Householder aura toujours la forme , mais nous ne travaillerons pas avec ( ), mais plutôt avec un vecteur , dont seule la première entrée est garantie à , etI−2uuTx u ∥x∥=1 w 1
On pourrait supposer qu'il serait très bien de stocker ces réflecteurs sous la diagonale ou excluant la première entrée de , et l'appeler un jour. Cependant, les choses ne sont jamais aussi faciles. Au lieu de cela, ce qui est stocké en dessous de la diagonale dans est une combinaison de et des coefficients dans la transformation Householder exprimée comme (1), de sorte que, définissant comme:w R 1 w tau
qr()$qr
Maintenant, nous sommes à un degré des vecteurs , et la première entrée n'est plus , d'où la sortie de devra inclure la clé pour les restaurer car nous insistons pour exclure la première entrée des vecteurs "réflecteur" à s'adapter à tout . Voyons-nous donc les valeurs dans la sortie? Eh bien, non, ce serait prévisible. Au lieu de cela, dans la sortie de (où cette clé est stockée), nous trouvons .w 1 τ ρ=∑reflectors22=wTwτ2/2
qr()
qr()$qr
qr()$qraux
Ainsi encadrés en rouge ci-dessous, on voit les "réflecteurs" ( ), à l'exclusion de leur première entrée.w/τ
Tout le code est ici , mais comme cette réponse concerne l'intersection du codage et de l'algèbre linéaire, je vais coller la sortie pour plus de facilité:
Maintenant, j'ai écrit la fonction
House()
comme suit:Comparons la sortie aux fonctions intégrées R. D'abord la fonction maison:
aux fonctions R:
la source