आर में varimax- घुमाए गए प्रमुख घटकों की गणना कैसे करें?


13

मैंने 25 चर पर पीसीए चलाया और शीर्ष 7 पीसी का चयन किया prcomp

prc <- prcomp(pollutions, center=T, scale=T, retx=T)

मैंने तब उन घटकों पर वरीमैक्स रोटेशन किया है।

varimax7 <- varimax(prc$rotation[,1:7])

और अब मैं पीसीए-रोटेट किए गए डेटा को बारी बारी से करना चाहता हूं (क्योंकि यह वेरिमैक्स ऑब्जेक्ट का हिस्सा नहीं है - केवल लोडिंग मैट्रिक्स और रोटेशन मैट्रिक्स)। मैंने पढ़ा कि ऐसा करने के लिए आप रोटेशन मैट्रिक्स के ट्रांसपोज़ेशन को डेटा के ट्रांसपोज़ से गुणा करते हैं, इसलिए मैंने ऐसा किया होता:

newData <- t(varimax7$rotmat) %*% t(prc$x[,1:7])

लेकिन इसका कोई मतलब नहीं है क्योंकि मैट्रिक्स के आयाम ऊपर बताए गए क्रमशः 7×7 और 7×16933 हैं और इसलिए मुझे 16933 पंक्तियों के बजाय केवल 7 पंक्तियों के मैट्रिक्स के साथ छोड़ दिया जाएगा ... क्या कोई जानता है कि मैं क्या हूं यहाँ गलत कर रहा हूँ या मेरी अंतिम पंक्ति क्या होनी चाहिए? क्या मुझे बाद में वापस ट्रांसफर करने की जरूरत है?16933

जवाबों:


22

"रोटेशन" कारक विश्लेषण में विकसित एक दृष्टिकोण है; वहाँ घुमाव (जैसे कि varimax) को लोडिंग पर लागू किया जाता है , न कि सहसंयोजक मैट्रिक्स के eigenvectors के लिए। लोडिंग eigenvectors संबंधित eigenvalues ​​के वर्गमूल द्वारा स्केल किए गए हैं। वेरीमैक्स रोटेशन के बाद, लोडिंग वैक्टर ऑर्थोगोनल नहीं होते हैं (भले ही रोटेशन को "ऑर्थोगोनल" कहा जाता है), इसलिए कोई भी घुमाए गए लोडिंग दिशाओं पर डेटा के ऑर्थोगोनल अनुमानों की गणना नहीं कर सकता है।

@ FTusell का जवाब मानता है कि वेरिमैक्स रोटेशन को आइजनवेक्टर (लोडिंग के लिए नहीं) पर लागू किया जाता है। यह बहुत अपरंपरागत होगा। कृपया विवरण के लिए PCA + varimax का मेरा विस्तृत विवरण देखें: क्या PCA एक रोटेशन (जैसे varimax) के बाद भी PCA है? संक्षेप में, यदि हम डेटा मैट्रिक्स के SVD को देखते हैं , तो लोडिंग को घुमाने के लिए कुछ रोटेशन मैट्रिक्स R के लिए R R सम्मिलित करने का मतलब है: X = ( U R ) ( R S V ) X=USVRRRX=(UR)(RSV).

यदि रोटेशन को लोडिंग पर लागू किया जाता है (जैसा कि आमतौर पर होता है), तो आर में वेरिमैक्स-रोटेटेड पीसी की गणना करने के लिए कम से कम तीन आसान तरीके हैं:

  1. वे फ़ंक्शन के माध्यम से आसानी से उपलब्ध हैं psych::principal(यह दर्शाता है कि यह वास्तव में मानक दृष्टिकोण है)। ध्यान दें कि यह मानकीकृत स्कोर लौटाता है , अर्थात सभी पीसी में इकाई भिन्नता होती है।

  2. एक मैन्युअल varimaxलोडिंग को घुमाने के लिए फ़ंक्शन का उपयोग कर सकता है , और फिर स्कोर प्राप्त करने के लिए नए घुमाए गए लोडिंग का उपयोग कर सकता है; किसी को रोटेट किए गए लोडिंग के ट्रांसपोज़्ड छद्म-व्युत्क्रम के साथ कई डेटा की आवश्यकता होती है ( @ttnphns द्वारा इस उत्तर में सूत्र देखें )। इससे मानकीकृत अंक भी प्राप्त होंगे।

  3. एक varimaxलोडिंग को घुमाने के लिए फ़ंक्शन का उपयोग कर सकता है , और उसके बाद $rotmatप्राप्त मानकीकृत स्कोर को घुमाने के लिए रोटेशन मैट्रिक्स का उपयोग कर सकता है prcomp

सभी तीन तरीकों से एक ही परिणाम मिलता है:

irisX <- iris[,1:4]      # Iris data
ncomp <- 2

pca_iris_rotated <- psych::principal(irisX, rotate="varimax", nfactors=ncomp, scores=TRUE)
print(pca_iris_rotated$scores[1:5,])  # Scores returned by principal()

pca_iris        <- prcomp(irisX, center=T, scale=T)
rawLoadings     <- pca_iris$rotation[,1:ncomp] %*% diag(pca_iris$sdev, ncomp, ncomp)
rotatedLoadings <- varimax(rawLoadings)$loadings
invLoadings     <- t(pracma::pinv(rotatedLoadings))
scores          <- scale(irisX) %*% invLoadings
print(scores[1:5,])                   # Scores computed via rotated loadings

scores <- scale(pca_iris$x[,1:2]) %*% varimax(rawLoadings)$rotmat
print(scores[1:5,])                   # Scores computed via rotating the scores

यह तीन समान आउटपुट देता है:

1 -1.083475  0.9067262
2 -1.377536 -0.2648876
3 -1.419832  0.1165198
4 -1.471607 -0.1474634
5 -1.095296  1.0949536

नोट:varimax आर में फ़ंक्शन का उपयोग करता normalize = TRUE, eps = 1e-5डिफ़ॉल्ट (द्वारा मानकों दस्तावेज़ देखें )। epsSPSS जैसे अन्य सॉफ़्टवेयर के परिणामों की तुलना करते समय कोई भी इन मापदंडों को बदलना चाहता है ( सहिष्णुता को कम करना और कैसर सामान्यीकरण का ख्याल रखना)। मेरा ध्यान में लाने के लिए मैं @GottfriedHelms का धन्यवाद करता हूं। [नोट: ये पैरामीटर varimaxफंक्शन में पास होने पर काम करते हैं, लेकिन फंक्शन में पास होने पर काम नहीं करते psych::principal। यह एक बग प्रतीत होता है जिसे ठीक किया जाएगा।]


1
मैं अब यह देखता हूं, और मुझे लगता है कि आप सही हैं। मैं विसंगति के स्रोत का पता लगाने के लिए अपने मूल उत्तर को संपादित करूंगा (या किसी अन्य को जोड़ूंगा)। मुझे आपके और @ttnphns के बहुत ही पूर्ण और गूढ़ उत्तर पसंद आए, विस्तृत विवरण प्रदान करना जो आमतौर पर किताबों में नहीं मिलते।
एफ। तुसैल

@amoeba मैं एक PCA + varimax का उपयोग करने की कोशिश कर रहा हूं principal, prcompऔर princomp, लेकिन परिणामी लोडिंग / अध्ययन के निष्कर्ष एक दूसरे से बहुत अलग हैं। जो मैं समझता हूं, उसके लिए prcomp और princomp मानकीकृत स्कोर और न ही लोडिंग वापस नहीं करता है। मेरा सवाल है: सबसे अच्छा तरीका क्या है? क्या मुझे वास्तव में मानकीकृत परिणाम चाहिए? क्या मेरा कोड आपके pca_iris <- prcomp(irisX, center=T, scale=T)बाद के varimax(pca_iris$rotation)$loadingsरूप में सही नहीं है?
JMarcelino

@JMarcelino, नहीं, आपका कोड eigenvectors पर varimax-रोटेशन करता है, लोडिंग पर नहीं। ऐसा नहीं है कि आमतौर पर वेरिमैक्स रोटेशन को कैसे समझा या लगाया जाता है।
अमीबा का कहना है कि मोनिका

1
X=USVRRRX=URRSVL=VSR/n1T=URn1
X=TL.
XLT
T=X(L)+=X(L+).

1
मुझे पैकेज के अनुरक्षक प्रो रेवेल का जवाब मिला। यह principalप्रक्रिया में मापदंडों से निपटने में एक बग लगता है , जो हमेशा कैसर-सामान्यीकरण और ईपीएस = 1e-5 के साथ गणना करता है। अभी तक कोई जानकारी नहीं है, क्यों r-fiddle.org पर संस्करण सही ढंग से काम करता है। इसलिए हमें अपडेट का इंतजार करना चाहिए - और मुझे अब सभी अप्रचलित टिप्पणियों को हटा देना चाहिए। अमीबा - अपने उत्तर में टिप्पणी को तदनुसार अद्यतन करना अच्छा होगा। सभी के सहयोग के लिए धन्यवाद!
गॉटफ्रीड हेल्स

9

आपको मैट्रिक्स का उपयोग करने की आवश्यकता है $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ऑर्थोगोनल मैट्रिक्स है जो नए लोडिंग को अनारक्षित लोगों से उत्पन्न करता है।

फरवरी, 12, 2015 तक EDIT:

n×mX

X=USVT
VXX
X=(UST)(TTVT)=UV
TVVUX(V)Tk<mkX
X(UkSk)(VkT)
X(UkSkTk)(TkTVkT)=UkVk
Vkk×nXVk, लेकिन इसके बजाय हमें @amoeba द्वारा वर्णित समाधानों में से एक का सहारा लेना होगा।

दूसरे शब्दों में, मैंने जो समाधान प्रस्तावित किया है वह केवल उस विशेष मामले में सही है जहां यह बेकार और निरर्थक होगा।

इस मामले को स्पष्ट करने के लिए हार्दिक धन्यवाद @amoeba पर जाएं; मैं इस भ्रांति के साथ वर्षों से रह रहा हूं।

SVLVSviTX (i=1,,m)vi=1

अन्य संस्करण फ़रवरी 12, 2015

जैसा कि @amoeba द्वारा बताया गया है, भले ही आयताकार है, मैंने जो प्रस्ताव प्रस्तावित किया है वह अभी भी स्वीकार्य हो सकता है: एक इकाई मैट्रिक्स देगा और । तो यह सभी अंकों की परिभाषा पर टिका हुआ है जो एक पसंद करता है। वी * कश्मीर ( वी * कश्मीर ) टी एक्स ( वी * कश्मीर ) टीयू * कश्मीरVkVk(Vk)TX(Vk)TUk


1
आह ठीक है भव्य। मैं भ्रमित हो गया क्योंकि prcomp के लिए लोडिंग को "रोटेशन" कहा जाता है, मदद को बेहतर ढंग से पढ़ना चाहिए। जब से मैं prcomp विधि में "केंद्र = TRUE, स्केल = TRUE" का उपयोग कर रहा हूं, इसका मतलब यह है कि वास्तव में मुझे अपने डेटा को अपने varimax $ लोडिंग से गुणा करने से पहले केंद्रित करना और स्केल करना होगा?
स्कॉट

1
हां, अच्छी बात है, मेरी गलती है। केंद्रित करना मायने नहीं रखेगा, जैसे कि केवल अंकों को शिफ्ट किया जाएगा, लेकिन स्केल का उपयोग मुख्य घटकों की गणना के लिए किया जाना चाहिए, जो स्केलिंग के लिए अपरिवर्तित नहीं हैं।
एफ। तुसैल

2
मैं यह उल्लेख करना भूल गया कि आप फंक्शन फैकलनल को देखना चाहते हैं, अगर आपने इसे पहले से नहीं किया है। यह प्रमुख घटकों के बजाय कारक विश्लेषण करता है, लेकिन स्कोर को सीधे लौटाएगा।
एफ। तुसैल

2
-1। मेरा मानना ​​है कि यह उत्तर सही नहीं है और मैंने इसे प्रदर्शित करने के लिए अपना उत्तर पोस्ट किया है। एक को घुमाए गए लोडिंग पर ऑर्थोगोनल प्रोजेक्शन द्वारा घुमाए गए स्कोर नहीं मिल सकते हैं (क्योंकि वे अब ऑर्थोगोनल नहीं हैं)। सही स्कोर प्राप्त करने का सबसे सरल तरीका उपयोग करना है psych::principal। [इसके अलावा, मैंने स्केलिंग सम्मिलित करने के लिए आपके उत्तर को संपादित किया, जैसा कि ऊपर की टिप्पणियों में चर्चा की गई है।]
अमीबा का कहना है कि मोनिका

1
माफ करना मेरा बुरा। मैं मतलब है । मैं इसे अब ठीक करूंगा। और ... हां, अब जब मैं इसे देखता हूं, तो पास ऑर्थोगोनल कॉलम हैं अभी भी हमें एक इकाई मैट्रिक्स मिलेगा, है ना? यदि हां, तो मैंने मूल पोस्टर को गुमराह नहीं किया, आप मेरी आत्मा से एक भार उठाएं! कश्मीर × एन वी ( टी टी कश्मीर वी टी कश्मीर ) ( वी कश्मीर टी कश्मीर )Vkk×nV(TkTVkT)(VkTk)
एफ। तुसैल

0

मैं एक समाधान की तलाश में था जो पीसीए के लिए काम करता है ade4 का उपयोग करके

कृपया नीचे दिए गए फ़ंक्शन को देखें:

library(ade4)

irisX <- iris[,1:4]      # Iris data
ncomp <- 2
# With ade4
dudi_iris <- dudi.pca(irisX, scannf = FALSE, nf = ncomp)

rotate_dudi.pca <- function(pca, ncomp = 2) {

  rawLoadings <- as.matrix(pca$c1[,1:ncomp]) %*% diag(sqrt(pca$eig), ncomp, ncomp)
  pca$c1 <- rawLoadings
  pca$li <- scale(pca$li[,1:ncomp]) %*% varimax(rawLoadings)$rotmat

  return(pca)
} 
rot_iris <- rotate_dudi.pca(pca = dudi_iris, ncomp = ncomp)
print(rot_iris$li[1:5,])                   # Scores computed via rotating the scores
#>        [,1]       [,2]
#> 1 -1.083475 -0.9067262
#> 2 -1.377536  0.2648876
#> 3 -1.419832 -0.1165198
#> 4 -1.471607  0.1474634
#> 5 -1.095296 -1.0949536

रिप्रेक्स पैकेज (v0.3.0) द्वारा 2020-01-14 को बनाया गया

उममीद है कि इससे मदद मिलेगी!


आपको उत्तर के लिए इस स्थान का उपयोग करने की आवश्यकता है।
माइकल आर। चेरिक

मुझे ऐसा लगा कि पूर्णता के लिए उत्तर जोड़ना वैध है। इस प्रश्न के लिए पसंद करें: stackoverflow.com/questions/6862742/draw-a-circle-with-ggplan2 । यदि आवश्यक हुआ तो मैं अपना प्रस्ताव स्थानांतरित करने में प्रसन्न रहूंगा।
एलेन दानेट

मैंने गलत समझा क्योंकि ऐसा लग रहा था कि आप किसी एक उत्तर में एक त्रुटि को सुधार रहे हैं। मुझे लगता है कि यह एक विशेष सॉफ्टवेयर पैकेज ad4 के लिए एक अतिरिक्त है। क्रॉस वैलिडेट उन प्रश्नों या उत्तरों को नहीं देखता है जो कोड के बारे में कड़ाई से हैं। स्टैक ओवरफ्लो वह जगह है जहां सॉफ्टवेयर मुद्दों को संबोधित किया जाता है।
माइकल आर। चेर्निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.