Küsimus:
Üldise aegridade perioodi tuvastamine
gianluca
2010-08-04 05:32:13 UTC
view on stackexchange narkive permalink

See postitus on jätk üks teisest postitusest, mis on seotud üldise meetodiga aegridade väljaarvamise tuvastamiseks. Põhimõtteliselt huvitab mind praegusel hetkel tugev viis avastada perioodilisust / hooajalisust üldine aegrida, mida mõjutab palju müra. Arendaja seisukohast tahaksin sellist lihtsat liidest nagu:

unsigned int Discover_period (vector<double> v);

Kus v on näidiseid sisaldav massiiv ja tagastusväärtus on signaali periood. Peamine on see, et ma ei saa jällegi oletada, et analüüsisin signaali. Ma proovisin juba signaali autokorrelatsioonil põhinevat lähenemist (korrelogrammi tippude tuvastamine), kuid see pole kindel, nagu ma tahaksin.

Kas olete proovinud xts :: perioodilisust?
Seitse vastused:
#1
+53
Rob Hyndman
2010-08-04 10:41:03 UTC
view on stackexchange narkive permalink

Kui teil tõesti pole aimugi, mis on perioodilisus, on ilmselt parim lähenemisviis leida spektraalse tiheduse maksimumile vastav sagedus. Kuid trend mõjutab madalate sageduste spektrit, seega peate kõigepealt seeria kavandama. Järgmine R-funktsioon peaks töö tegema enamiku seeriate jaoks. See pole kaugeltki täiuslik, kuid olen seda proovinud mõnekümne näite põhjal ja tundub, et see töötab hästi. See tagastab 1 andmete puhul, millel pole tugevat perioodilisust, ja muidu perioodi pikkus.

Uuendus: funktsiooni 2. versioon. See on palju kiirem ja näib olevat jõulisem.

  find.freq <- function (x) {n <- length (x) spec <- spec.ar (c (x), plot = FALSE) if (max (spec $ spec) >10) # Katse-eksituse meetodil valitud meelevaldne künnis. {periood < - ring (1 / spec $ freq [mis.max (spec $ spec)]) if (periood == Inf) # Leia järgmine kohalik maksimum {j <- mis (diff (spec $ spec) >0) pikkus (j) >0) {nextmax <- j [1] + mis.max (spec $ spec [j [1]: 500]) periood <- ring (1 / spec $ freq [nextmax])} muu periood <- 1}} else period <- 1 return (period)}  
Aitäh. Jällegi proovin seda lähenemist nii kiiresti kui võimalik ja kirjutan siia lõpptulemused.
Teie idee on üsna hea, kuid minu puhul ei suuda see tuvastada tõeliselt lihtsate (ja mitte nii lärmakate) aegridade nagu http://dl.dropbox.com/u/540394/chart.png perioodilisust. Minu "empiirilise" lähenemisviisi korral (põhineb autokorrelatsioonil) tagastab minu kirjutatud lihtne algoritm täpse perioodi 1008 (kui valim on iga 10 minuti järel, tähendab see 1008/24/6 = 7, seega iganädalane perioodilisus). Minu peamised probleemid on järgmised: 1) Lähenemine on liiga aeglane (see nõuab palju ajaloolisi andmeid) ja ma vajan reaktiivset, veebipõhist lähenemist; 2) See on mälukasutuse seisukohast pagana ebaefektiivne; 3) See pole jõuline kõik;
Aitäh. Kahjuks ei toimi see ikkagi nii, nagu ma eeldaksin. Eelmise kommentaari sama aegridade puhul tagastatakse see 166, mis on õige vaid osaliselt (minu seisukohast on ilmne nädalane periood huvitavam). Ja kasutades väga lärmakaid aegridu, nagu see on http://dl.dropbox.com/u/540394/chart2.png (TCP vastuvõtja akna analüüs), tagastab funktsioon 10, samas kui ma eeldaksin, et 1 (võin ' t näha ilmset perioodilisust). BTW Ma tean, et seda, mida ma otsin, on tõesti raske leida, kuna ma tegelen liiga erinevate signaalidega.
166 pole halb hinnang 168-le. Kui teate, et andmeid vaadatakse tunni kaupa nädala mustriga, siis milleks üldse sagedust hinnata?
Sest ma pean analüüsima paljusid aegridu (oletame, et 100 võrgumõõdikut) ja ainult mõnel neist on nädalane perioodilisus. Igal juhul kasutan oma rakenduses vist algoritmi, mis sarnaneb teie funktsiooniga, ja eristan käsitsi nädala perioodilisust. Suur tänu teie toetuse eest, ma tõesti hindan (ja jätkan prognooside raamatukoguga head tööd :-))
Testisin seda funktsiooni lihtsa näitega: x = c (58.89446, 37.31097, 53.99865, 26.13904, 34.74298) ja y = ts (rep_len (x, 15 * pikkus (x)). Eespool toodud määratlust kasutades ootasin, et saan15 kui find.freq (y) (või midagi lähedast), aga saan 3. Mis mul siin puudu on?
Miks mitte lisada see mõnda paketti?Kui perioodilisus on teadmata, on palju ülesandeid.
Täiustatud versioon on prognoosipaketis kui "leidesagedus"
#2
+10
Rich
2010-08-10 23:41:11 UTC
view on stackexchange narkive permalink

Kui eeldate, et protsess on paigal - perioodilisus / hooajalisus aja jooksul ei muutu -, võib hea valik olla näiteks Chi-ruudu periodogrammi sarnane (vt nt Sokolove ja Bushell, 1978). Seda kasutatakse tavaliselt ööpäevaringsete andmete analüüsimisel, milles võib olla äärmiselt palju müra, kuid eeldatavasti on neil väga stabiilne perioodilisus.

See lähenemisviis ei eelda lainekuju kuju (peale selle see on tsüklilt tsüklile järjepidev), kuid nõuab, et igasugune müra oleks püsiva keskmise ja signaaliga korreleerimata.

  chisq.pd <- funktsioon (x, min. periood, max. periood, alfa) {N < - pikkuse (x) varieeruvus = NULLperiods = seq (min.period, max.period) rowlist = NULLfor (lc periods) {ncol = lc now = floor (N / ncol) rowlist = c ( ridade loend, nrow) x.trunc = x [1: (ncol * nrow)] x.reshape = t (massiiv (x.trunc, c (ncol, nrow))) dispersioonid = c (dispersioonid, var (colMeans (x. ümber kujundama)))} Qp = (ridade nimekiri * perioodid * varieerumised) / var (x) df = punktid - 1pvals = 1-pchisq (Qp, df) pass.periods = perioodid [pvals<alpha] pass.pvals = pvals [pvals<alpha] # return (cbind (pass.periods, pass.pvals)) return (cbind (punktid [pvals == min (pvals)], pvals [pvals == min (pvals)]))} x = cos ((2 * pi / 37) * (1: 1000)) + rnorm (1000) chisq.pd (x, 2, 72, .05)  

Viimased kaks rida on vaid näide, mis näitab, et see suudab tuvastada puhta trigonomeetrilise funktsiooni perioodi isegi paljude lisandmüra korral.

Nagu kirjutatud, on kõne viimane argument ( alfa ) üleliigne, funktsioon tagastab lihtsalt 'parima' perioodi, mille võib leida; tühistage esimene lause return ja kommenteerige teine, et see tagastaks kõigi oluliste perioodide loendi tasemel alfa .

See funktsioon ei tee mingit mõistlikkuse kontrolli, veendumaks, et olete määranud kindlaksmääratavad ajavahemikud, samuti ei tööta see (ei saa) murdosadega ega ka sisseehitatud mitut võrdluskontrolli, kui otsustate vaadata mitut perioodi. Kuid peale selle peaks see olema piisavalt jõuline.

Tundub huvitav, kuid ma ei saa väljundist aru, see ei ütle mulle, kus periood algab, ja enamik väärtusest 1.
#3
+4
Wesley Burr
2010-08-06 07:48:10 UTC
view on stackexchange narkive permalink

Võite määratleda, mida soovite, selgemini (iseendale, kui mitte siin). Kui otsite statistiliselt kõige olulisemat statsionaarset perioodi, mis sisaldub teie mürarikastes andmetes, tuleb valida kaks teed:

1) arvutage kindel autokorrelatsiooni prognoos ja võtke maksimaalne koefitsient
2) arvutage kindel spektraalse tiheduse hinnang ja võtke spektri maksimum välja.

# 2 probleem on see, et mürarikaste aegridade korral saate madalatel sagedustel palju energiat, muutes seda on raske eristada. Selle probleemi lahendamiseks on mõned tehnikad (st. Eelvalgendage, seejärel hinnake PSD-d), kuid kui teie andmete tegelik periood on piisavalt pikk, on automaatne tuvastamine ebamäärane.

Teie parim valik on tõenäoliselt rakendada tugevat autokorrelatsiooni rutiini, nagu näiteks Maronna, Martini ja Yohai jaotises Robustne statistika - teooria ja meetodid peatükis 8.6, 8.7. Google'ist "robust durbin-levinson" otsides saate ka mõned tulemused.

Kui otsite lihtsalt lihtsat vastust, pole ma kindel, kas see on olemas. Perioodide tuvastamine aegridades võib olla keeruline ja nõuda automaatse rutiini kasutamist, mis suudab maagiat teha, võib olla liiga palju.

Täname teid väärtusliku teabe eest. Ma vaatan seda raamatut kindlasti.
#4
+4
babelproofreader
2010-08-10 22:29:28 UTC
view on stackexchange narkive permalink

Andmete hetkesageduse mõõtmiseks võite kasutada Hilbert Transformation from DSP teooriat. Saidil http://ta-lib.org/ on finantsandmete domineeriva tsükli perioodi mõõtmiseks avatud lähtekood; vastavat funktsiooni nimetatakse HT_DCPERIOD; võite seda kasutada või kohandada koodi oma eesmärkidele.

#5
+3
Fabrizio Maccallini
2016-12-29 19:15:47 UTC
view on stackexchange narkive permalink

Teiseks lähenemisviisiks võiks olla empiirilise režiimi lagundamine.R-paketti nimetatakse EMD , mille on välja töötanud meetodi leiutaja:

  need (EMD) ndata <- 3000 tt2 <- seq (0, 9, length =ndata) xt2 <- sin (pi * tt2) + sin (2 * pi * tt2) + sin (6 * pi * tt2) + 0,5 * tt2 proovige <- emd (xt2, tt2, piiri = "laine") ### IMFi par (mfrow = c (proovige $ nimf + 1, 1), mar = c (2,1,2,1)) vahemiku joonistamine rangeimf <- vahemik (proovige $ imf) (i in 1: proovige $ nimf) {plot (tt2, try $ imf [, i], type = "l", xlab = "", ylab = "", ylim = rangeimf, main = paste (i, "-th IMF", sep = ""));abline (h = 0)} joonis (tt2, proovige $ resid, xlab = "", ylab = "", main = "resid", type = "l", teljed = FALSE);box ()  

Meetodi kaubamärgiks oli empiiriline mõjuval põhjusel ja on oht, et sisemised režiimifunktsioonid (üksikud lisakomponendid) segunevad.Teiselt poolt on meetod väga intuitiivne ja võib olla kasulik tsüklilisuse kiireks visuaalseks kontrollimiseks.

#6
  0
Chris
2015-05-02 20:24:14 UTC
view on stackexchange narkive permalink

Viidates Rob Hyndmani postitusele https://stats.stackexchange.com/a/1214/70282 kohal

Funktsioon find.freq töötab suurepäraselt. Kasutatavas igapäevases andmekogumis töötas korrektselt välja sagedus 7.

Kui proovisin seda ainult nädalapäevadel, mainis see sagedust 23, mis on märkimisväärselt lähedal 21,42857 = 29,6 * 5/7, mis on keskmine tööpäevade arv kuus. (Või vastupidi, 23 * 7/5 on 32.)

Oma igapäevastele andmetele tagasi vaadates katsetasin esimest perioodi võtmise aimdust, selle keskmistamist ja seejärel järgmise perioodi leidmist jne. allpool:

 find.freq.all = function (x) {f = find.freq (x); sagedus = c (f); samas (f> 1) {algus = 1; # proovige ka algust = f; x = periood.rakenda (x, seq (algus, pikkus (x), f), keskmine); f = leid.freq (x); sagedus = c (sagedus, f); } if (pikkus (sagedus) == 1) {tagastus (sagedus); } jaoks (i kahes: pikkus (sagedus)) {sagedus [i] = sagedus [i] * sagedus [i-1]; } sagedus [1: (pikkus (sagedus) -1)];} find.freq.all (dailyts) # igapäevaste andmete kasutamine 

Ülaltoodu annab (7,28) või (7,35) sõltuvalt sisse, kui seq algab 1 või f-ga. (Vt ülaltoodud kommentaari.)

Mis tähendaks, et msts (...) hooajalised perioodid peaksid olema (7,28) või (7,35).

Loogika algoritmide parameetrite tundlikkust arvestades tundub algtingimuste suhtes tundlik. 28 ja 35 keskmine on 31,5, mis on lähedal kuu keskmisele pikkusele.

Kahtlustan, et leiutasin ratta uuesti, mis on selle algoritmi nimi? Kas kusagil on R-s parem rakendamine?

Hiljem jooksin ülaltoodud koodi, proovides kõiki algusi vahemikus 1 kuni 7 ja sain teise jaoks 35,35,28,28,28,28,28 periood. Keskmine töötab 30-ni, mis on keskmine päevade arv kuus. Huvitav ...

Kas teil on mõtteid või kommentaare?

#7
  0
ali
2016-09-27 17:10:59 UTC
view on stackexchange narkive permalink

Ljung-Boxi testi abil saab välja selgitada, milline hooajaline erinevus saavutab parima statsionaarsuse. Töötasin teise teema kallal ja kasutasin seda tegelikult samadel eesmärkidel. Igakuiste andmete saamiseks proovige erinevaid perioode, näiteks 3–24. Ja testige neid kõiki Ljung-Boxi abil ja salvestage Chi-Square'i tulemused. Ja valige madalaima chi-ruutväärtusega periood.

Selleks on lihtne kood.

  minval0 <- 5000 # määrake suur arv, et olla kindel, et Chi-väärtused on väikesederminindex0 <- 0periyot <- 0for (i in 3:24) {#find optimaalne periood Qtestide poolt algandmete kohta d0D1 <- diff (a, lag = i) #store results Qtest_d0D1 [[i]] <- Box.test (d0D1, lag = 20, tippige = "Ljung-Box") #store Chi-Square statistika sira0 [i] <- Qtest_d0D1 [[i]] [1]} # pööra loend andmeraamile ja seejärel matrixdatam0 <- data.frame (maatriks (loetlemata (sira0), nrow = pikkus (Qtest_d0D1) -2, byrow = T)) datamtrx0 <- as.matrix (datam0 []) # get min value indexminindex0 <- mis (datamtrx0 == min (datamtrx0), arr. ind = F) perioot <- minindex0 + 2  


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 2.0-litsentsi eest, mille all seda levitatakse.
Loading...