あなたは、マトリックスを使用する必要は $loadings
、ありません$rotmat
。
x <- matrix(rnorm(600),60,10)
prc <- prcomp(x, center=TRUE, scale=TRUE)
varimax7 <- varimax(prc$rotation[,1:7])
newData <- scale(x) %*% varimax7$loadings
行列$rotmat
は、回転していないものから新しい負荷を生成する直交行列です。
2015年2月12日現在の編集:
以下で@amoebaが正しく指摘しているように(彼の以前の投稿と@ttnphnsからの別の投稿も参照)、この答えは正しくありません。データ行列Xを考えます。特異値分解は
X = U S V Tです。ここで、Vは列として(正規化された)X ′ Xの固有ベクトルを持ちます。さて、回転は座標の変化であり、上記の等式を次のように書くことになります:
X = (U S T )(T T V T)n × mバツ
バツ= USVT
Vバツ′バツと
Tを達成するように選択された直交行列である
Vを*疎に近い(エントリ間の最大コントラスト、緩く言えば)。さて、
それがすべてではない場合、上記の等式に
V ∗をポスト乗算してスコア
U ∗を
X (V ∗ )Tとして取得できますが、もちろんすべてのPCを回転させることはできません。むしろ、我々はのサブセット考える
K < M、まだまともなrank-提供して
k個の近似値
X、
Xを≈バツ= (UST)(TTVT)= U∗V∗
TV∗V∗うん∗バツ(V∗)Tk < mkバツ
ので、回転解決する今
X ≈ (U K S K T K)(T T K V TのK)= U * k個の V * K
今
V * kがあり
、kは× n行列。
Xに
V ∗ kの転置を単純に掛けることはできません
バツ≈ (UkSk)(VTk)
バツ≈ (UkSkTk)(TTkVTk)= U∗kV∗k
V∗kk × nバツV∗k、しかし、@ amoebaで説明されているソリューションの1つに頼る必要があります。
言い換えれば、私が提案した解決策は、役に立たず無意味な特定の場合にのみ正しいものです。
この問題を明確にしてくれた@amoebaに心から感謝します。私は何年もの間、この誤解に生きてきました。
SVLVSvT私バツ (i = 1 、… 、m )∥ V私∥ = 1。どちらの方法も受け入れられると思いますし、その間にあるすべてのものは(バイプロット分析のように)。
さらなる編集2015年2月12日
V∗kV∗k(V∗k)Tバツ(V∗k)T≈ U∗k