Pitanje:
Dobivam "skakutava" opterećenja u rollapply PCA u R. Mogu li to popraviti?
Thomas Browne
2012-08-16 01:13:01 UTC
view on stackexchange narkive permalink

Imam 10 godina dnevnih podataka o povratu za 28 različitih valuta. Želim izvući prvu glavnu komponentu, ali umjesto da radim PCA tijekom cijelih 10 godina, želim primijeniti dvogodišnji prozor, jer se ponašanje valuta razvija, pa želim to odražavati. Međutim, imam glavni problem, to jest da će funkcije princomp () i prcomp () često preskakati s pozitivnih na negativne opterećenja u susjednim PCA analizama (tj. U razmaku od 1 dana). Pogledajte grafikon učitavanja valute EUR:

enter image description here

Jasno je da to ne mogu koristiti jer će susjedna opterećenja skočiti s pozitivnog na negativan, tako da moja serija koja koristi ih bit će pogrešno. Sada pogledajte apsolutnu vrijednost učitavanja valute EUR:

enter image description here

Problem je, naravno, što to još uvijek ne mogu koristiti jer možete vidjeti na gornjoj ljestvici da opterećenje ponekad pređe s negativnog na pozitivno i natrag, obilježje koje trebam sačuvati.

Mogu li na neki način zaobići ovaj problem? Mogu li prisiliti orijentaciju vlastitih vektora da uvijek bude ista u susjednim PCA-ima?

Inače, ovaj se problem javlja i s funkcijom FactoMineR PCA (). Kôd za rollapply nalazi se ovdje:

  rollapply (retmat, windowl, function (x) sažetak (princomp (x)) $ loadings [, 1], by.column = FALSE, align = "desno") -> princomproll  
Možete li objasniti što mislite pod vlastitim vektorom "orijentacija"? Koliko znam, ne postoji takva stvar koja je * suštinska za podatke. * (To je jedan od razloga zašto će različiti softveri proizvoditi različite normalizirane vlastite vektore.) Dakle, zvuči kao da tražite nešto što ne postoji, a jest besmisleno.
Pa jednog dana dobit ću ovakva opterećenja: EUR -0,2 ZAR +0,8 USD +0,41 ..... 28 valuta.A sljedeći dan ću dobiti EUR +0,21 ZAR -0,79 USD -0,4 itd. Tako da os da je PCA odabrao rotaciju podataka na, usmjeren je upravo suprotno na 2. dan u usporedbi s 1. danom. To uzrokuje ove skokove učitavanja i želim to nekako izbjeći ... zavaravajući. Razumijem da PCA kod zapravo ne brine o orijentaciji osi sve dok je dosljedan u svim opterećenjima * jedan dan *, ali moram da bude dosljedan u više dana.
imajući na umu da bismo od jednog dana do sljedećeg, s obzirom na neprekidni dvogodišnji prozor dnevnih podataka, trebali imati vrlo, vrlo sličan PCA.
Mislim da je razlog što imate problem taj što ta ideja o prevrtanju nema smisla. Nemam drugog rješenja osim da potražim nešto drugo što može postići vaše ciljeve (nisam siguran koji su oni) i što je razumno.
`EUR -0,2 ZAR +0,8 USD + 0,41` i` EUR +0,21 ZAR -0,79 USD -0,4` _ su_ vrlo slični. Jednostavno obrnete znak u bilo kojem od dva rezultata.
Zašto nema smisla da euro, valuta koja je uglavnom bila jaka u razdobljima averzije, sada ima tendenciju biti slab u istim razdobljima averzije? Prošli smo kroz veliku financijsku krizu, a ponašanje nekih valuta sada se razlikuje od načina na koji su funkcionirali prije krize. 10-godišnji PCA očito neće identificirati ovu promjenu ponašanja, dok se 2-godišnji okretni prozor jasno vidi. Mogao bih identificirati ovu promjenu pomoću korelacija na prvom računalu, ali vjerojatno bih ionako dobio puno slabiji prvi PC, pa mislim da je ova valjana PCA tehnika superiornija?
Mislim da bi osnovni uvjet da se valjani vlastiti vektori stave u zajednički vektorski prostor ("mogu li prisiliti vlastite vektore ... iste orijentacije") trebao biti uobičajeno mjerenje u svim uzorkovanjima. To znači po mom mišljenju, trebali biste pretpostaviti skalu omjera za svoja mjerenja i spriječiti da se analize faktora kotrljanja ponovno centriraju i ponovno skaliraju trenutni poduzorak (pa to znači i da se koristi matrica kovarijancije kotrljanja umjesto matrice korelacije osim sprečavanja ponovnog centriranja oko dinamičkih sredstava). Jeste li ovo razmotrili?
@ Gottfried Helms: Gottfried, gornji grafikoni koriste pokretnu matricu kovarijancije jer je to zadana funkcija princomp (cor = FALSE). Štoviše, već sam skalirao varijable jer, kao što ćete primijetiti, koristim samo "EUR", a ne "EURUSD" ili neku drugu cijenu unakrsne cijene, jer sam stvorio indekse normalizacije varijance i skale za svaku valutu koja je izvedena iz PCA. Dakle, da, svi moji uzorci u različitim valutama koriste uobičajeno i usporedivo skaliranje i u veličini i u varijanti. Jesi li to mislio?
Tri odgovori:
whuber
2012-08-16 02:54:42 UTC
view on stackexchange narkive permalink

Kad god radnja previše skoči, obrnite orijentaciju. Jedan od učinkovitih kriterija je sljedeći: izračunajte ukupnu količinu skokova na svim komponentama. Izračunajte ukupnu količinu skokova ako je sljedeći vlastiti vektor negiran. Ako je potonje manje, negirajte sljedeći vlastiti vektor.

Evo implementacije. (Nisam upoznat sa zoo , što bi moglo omogućiti elegantnije rješenje.)

  zahtijeva (zoološki vrt) izmijeniti funkciju < (rezultat) {result.m < - as.matrix (rezultat) n <- dim (rezultat.m) [1] delta <- primijeniti (abs (rezultat.m [-1,] - rezultat.m [-n,]), 1, zbroj) delta .1 <- primijeniti (abs (rezultat.m [-1,] + rezultat.m [-n,]), 1, zbroj) znakovi <- c (1, cumprod (rep (-1, n-1) ^) (delta.1 < = delta))) zoološki vrt (rezultat * znakovi)}  

Kao primjer, pokrenimo nasumičnu šetnju u pravokutnoj skupini i malo je podrhtavamo zbog interesa:

random.rotation <- funkcija (eps) {theta <- rnorm (3, sd = eps) matrica (c (1, theta [1: 2], -theta [1], 1 , theta [3], -theta [2: 3], 1), 3)} set.seed (17) n.times <- 1000x <- matrica (1, nrow = n.times, ncol = 3) za (i u 2: n.times) {x [i,] <- random.rotation (.05)% *% x [i-1,]}  

Evo tekućeg PCA :

  prozor <- 31data <- zoo (x) rezultat <- rollapply (podaci, prozor, funkcija (x) sažetak (princomp (x)) $ loadings [, 1], by.column = FALSE, align = "right") crtanje (rezultat) / code> 

Original

Sada je fiksna verzija:

  plot (izmijeniti (rezultat))  

Amended

Odavno sam podržao ovaj sjajni odgovor, ali sada sam se vratio na njega jer sam i sam morao primijeniti nešto slično.Pristup koji sam odabrao (prije nego što sam ponovno pogledao vaš post) bio je proći kroz sve vremenske točke $ t_i $ i izračunati točkasti proizvod između vodećeg vlastitog vektora $ \ mathbf v_ {i + 1} $ (prva PC os) na vremenskom koraku $i + 1 $ i svojstveni vektor $ \ mathbf v_ {i} $ na prethodnom koraku $ i $.Ako je ovaj točkasti proizvod blizu 1 USD, ne poduzimajte ništa.To je blizu $ -1 $, okrenite smjer $ \ mathbf v_ {i + 1} $.Čini se da je vaš algoritam malo drugačiji.Bi li djelovalo na isti način?
@amoeba Iako nisam sasvim siguran što točno radite, zvuči kao neke ideje o kojima se raspravljalo u odgovoru Davida J. Harrisa i komentarima nakon njega.Pogledajte, posebno, moj komentar na http://stats.stackexchange.com/questions/34396/im-getting-jumpy-loadings-in-rollapply-pca-in-r-can-i-fix-it/34401?noredirect = 1 # komentar68515_34399.
David je predložio da se popravi znak jedne koordinate vektora $ \ mathbf v $ (vlastiti vektor $ \ približno $ vektor učitavanja).Slažem se s vama da to nije dovoljno.Štoviše, ** u potpunosti ** se slažem s vama da * "Trik je u svakom trenutku odabrati orijentaciju koja stvara najmanje smetnji u vektoru opterećenja iz prethodnog vremena" *.Dakle, moj pristup je izmjeriti ovaj poremećaj gledajući kut između novog vektora opterećenja i prethodnog vektora opterećenja.Preokrenite novi vektor ako je kut oko $ 180 ^ \ circ $ (i ne okrećite ako je oko $ 0 ^ \ circ $).
No, nakon što ponovno pogledam vaš odgovor, vjerujem da su naši pristupi gotovo identični.
@amoeba Algoritmi su bliski, ali nisu isti i mogu donijeti različite rezultate.Isprobajte svoje s uzorcima podataka koje stvara moj kôd.
@whuber Jao, ja nisam R korisnik: - / Ali vidim razliku u algoritmima;pretpostavljam da će u praksi oboje raditi u redu.
@amoeba i whuber: hvala na odgovorima, iako još uvijek postoji problem - svaki algoritam zahtijeva upotrebu dva vektora za usporedbu i pretpostavlja da prvi vektor ima ispravnu orijentaciju, ali što ako je prvi vektor pogrešan i ako ostatak pokušamo prilagoditiprvi, u ovom slučaju invertiramo orijentaciju svih ispravnih vektora.Ima li netko rješenje kojim se može provjeriti ispravnost prvog vektora, kao što je ovdje opisano - http://quant.stackexchange.com/questions/3094/time-series-of-pca-sign-change-in-factor-loadings / 18380 # answer-18380?
@Art,, ali što znači da je prvi vektor "ispravan"?Znamo da je znak ovog vektora proizvoljan.Čini se da je cijela stvar samo u tome da se znakovi ujednače na različitim položajima kliznog prozora, ali početni znak u prvom prozoru ostaje proizvoljan.
@amoeba: da, znam za "proizvoljne" znakove, u mom slučaju moram projicirati izvorne točke na odabranu glavnu komponentu ili svojstveni prostor koristeći koeficijente iz vlastitog vektora, u ovom slučaju dobit ću srednju vrijednost obrnutog kapitala koja uvijek konvergira na nulu.To znači da mogu kupiti na dnu - i prodati ga na nultoj razini.Problem je u tome što ponekad neka imovina u portfelju ima trend (dugo kretanje u nekom smjeru), npr.EUR pada tijekom jednog mjeseca, istovremeno PCA vraća pozitivan vlastiti vektor za EUR, pogrešno je, koeficijent bi trebao ići u trendu i biti s minusom.
@Art,, kako razumijem, želite popraviti znak komponente na temelju nekih vanjskih (vanjskih prema PCA) preferencijama.Ovo je u redu, ali tako biste trebali tome pristupiti.Prvo napravite klizni PCA, vodeći računa da znakovi budu dosljedni.A onda na temelju nekih dodatnih kriterija odlučite hoćete li preokrenuti cijelu komponentu ili ne.Npr.možete ga povezati s trendom eura i ako je korelacija negativna, preokrenite komponentu.Ili tako nešto.To u potpunosti ovisi o vašoj specifičnoj aplikaciji i znanju vaše domene.
Slažem se s tumačenjem i preporukom @amoeba's.
@amoeba: da, u pravu si u vezi s tim, premda sam naivno pomislio da bi moglo postojati neko generičko rješenje koje ne ovisi o određenim vremenskim serijama, nešto poput "stvarne orijentacije vektora" :) svejedno, hvala na pomoći i prijedlozima
David J. Harris
2012-08-16 01:45:09 UTC
view on stackexchange narkive permalink

@whuber je u pravu da ne postoji orijentacija koja je svojstvena podacima, ali svejedno možete utvrditi da vaši vlastiti vektori imaju pozitivnu korelaciju s nekim referentnim vektorom.

Na primjer, možete napraviti opterećenja za USD pozitivna na svim vašim vlastitim vektorima (tj. ako je USD opterećenje negativno, preokrenite znakove cijelog vektora). Ukupni smjer vašeg vektora i dalje je proizvoljan (budući da ste umjesto toga mogli upotrijebiti EUR ili ZAR kao referencu), ali prvih nekoliko osi vašeg PCA-a vjerojatno se neće skakati ni približno toliko - pogotovo jer su vam valjkasti prozori dugo.

Dobra ideja. Prvo sam probao (vjerojatno dok ste objavljivali ovaj odgovor :-). Problem je u tome što se ostala opterećenja mogu poskočiti. Da biste to popravili, izbor znaka temeljite na najvećem opterećenju. Još uvijek nema kockica: opterećenja i dalje mogu skočiti. Trik je u svakom trenutku odabrati orijentaciju koja stvara najmanje smetnji u * vektoru * opterećenja iz prethodnog vremena.
@whuber Dobar posao.
Točno, znak opterećenja nije važan (orijentacija). Nešto na što se nije odnosilo je da ako to izvodite na različitim softverskim paketima, razlike između paketa su u tome što jedan program može rezultirati negativnim (pozitivnim) znakovima na određenim opterećenjima, dok drugi rezultira pozitivnim (negativnim) znakovima za ista učitavanja. Stoga bi se znakovi konačnih rezultata u gornjoj plohi od 3 serije mogli obrnuti kada se koristi drugi paket. Učitavanja referentnih vektora također mogu imati promjenu znaka - i ovo rješenje ne bi bilo netočno.
@LEP: Suočio sam se s istim problemom s inverzijom, možda ste već pronašli rješenje za ovaj problem - kako saznati je li prvi vektor točan i pobrinuti se da ostatak bude ispravno poravnat s njim - http: //quant.stackexchange.com / questions / 3094 / time-series-of-pca-sign-change-in-factor-loadings / 18380 # answer-18380?
Sve dok matrica nije singularna i niti jedna vlastita vrijednost nije nula, većina rezultata algoritma trebala bi biti ista, osim promjene znakova od 180 stupnjeva - što nije zajamčeno.
Raul Muñoz
2018-10-15 09:32:11 UTC
view on stackexchange narkive permalink

Ono što sam učinio bilo je izračunati udaljenost L1 između uzastopnih vlastitih vektora.Nakon normalizacije ove matrice biram prag z ocjene, na pr.1, tako da ako je bilo koje novo kotrljanje promjena iznad ovog praga, preokrećem svoj vlastiti vektor, faktore i opterećenja kako bih imao konzistentnost u kotrljajućem prozoru.Osobno ne volim forsirati dane znakove u nekim korelacijama, jer oni mogu biti vrlo hiroviti, ovisno o pokretačima makronaredbi.



Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...