জেনেরিক সময় সিরিজের পিরিয়ড সনাক্তকরণ


53

এই পোস্টটি টাইম সিরিজে আউটিলার সনাক্তকরণের জন্য জেনেরিক পদ্ধতি সম্পর্কিত আরও একটি পোস্টের ধারাবাহিকতা । মূলত, এই মুহুর্তে আমি প্রচুর আওয়াজ দ্বারা প্রভাবিত জেনেরিক সময় সিরিজের সাময়িকতা / alityতু আবিষ্কার করার শক্তিশালী উপায়ে আগ্রহী। বিকাশকারী দৃষ্টিকোণ থেকে, আমি একটি সাধারণ ইন্টারফেস চাই যেমন:

unsigned int discover_period(vector<double> v);

vনমুনাগুলি সমেত অ্যারে কোথায় থাকে এবং ফেরতের মান সংকেতের সময়কাল। মূল কথাটি হ'ল, আবার বিশ্লেষিত সংকেত সম্পর্কে আমি কোনও অনুমান করতে পারি না। আমি ইতোমধ্যে সিগন্যাল অটোকোরিলেশনের উপর ভিত্তি করে একটি পদ্ধতির চেষ্টা করেছি (একটি সিলেগ্রামের শিখর সনাক্তকরণ), তবে এটি আমার মতো শক্ত নয়।


1
আপনি কি Xts :: পর্যায়ক্রমিকতা চেষ্টা করেছেন?
ফ্যাব্রেসিও

উত্তর:


49

পর্যায়ক্রমিকতা কী তা আপনার যদি সত্যিই ধারণা না থাকে তবে বর্ণালি ঘনত্বের সর্বাধিকের সাথে সঙ্গতিপূর্ণ ফ্রিকোয়েন্সিটি সন্ধান করার পক্ষে সর্বোত্তম পন্থা। তবে, কম ফ্রিকোয়েন্সিতে বর্ণালী ট্রেন্ড দ্বারা প্রভাবিত হবে, সুতরাং আপনাকে প্রথমে সিরিজটি অবনতি করতে হবে। নিম্নলিখিত আর ফাংশনটি বেশিরভাগ সিরিজের জন্য কাজ করা উচিত। এটি নিখুঁত থেকে দূরে, তবে আমি কয়েক ডজন উদাহরণে এটি পরীক্ষা করেছি এবং এটি ঠিকঠাক বলে মনে হচ্ছে। এটি শক্তিশালী পর্যায়ক্রমিক না থাকা ডেটা এবং অন্যথায় পিরিয়ডের দৈর্ঘ্যের জন্য 1 প্রদান করবে।

আপডেট: ফাংশনের সংস্করণ 2। এটি অনেক দ্রুত এবং এটি আরও দৃ be় বলে মনে হয়।

find.freq <- function(x)
{
    n <- length(x)
    spec <- spec.ar(c(x),plot=FALSE)
    if(max(spec$spec)>10) # Arbitrary threshold chosen by trial and error.
    {
        period <- round(1/spec$freq[which.max(spec$spec)])
        if(period==Inf) # Find next local maximum
        {
            j <- which(diff(spec$spec)>0)
            if(length(j)>0)
            {
                nextmax <- j[1] + which.max(spec$spec[j[1]:500])
                period <- round(1/spec$freq[nextmax])
            }
            else
                period <- 1
        }
    }
    else
        period <- 1
    return(period)
}

ধন্যবাদ. আবার, আমি যত তাড়াতাড়ি সম্ভব এই পদ্ধতির চেষ্টা করব এবং এখানে চূড়ান্ত ফলাফল লিখব।
gianluca

2
আপনার পরিকল্পনা বেশ ভাল, কিন্তু আমার ক্ষেত্রে, এটা মত একটি সত্যিই সহজ (এবং তাই সশব্দ নয়) সময় সিরিজের পর্যাবৃত্তি সনাক্ত করতে ব্যর্থ হয় dl.dropbox.com/u/540394/chart.png । আমার "অভিজ্ঞতাবাদী" পদ্ধতির সাথে (স্বতঃসংশ্লিষ্টতার উপর ভিত্তি করে), আমি যে সাধারণ অ্যালগরিদম লিখেছিলাম তা সঠিক সময়টি 1008 দেয় (প্রতি 10 মিনিটে একটি নমুনা থাকে, এর অর্থ 1008/24/6 = 7, সুতরাং একটি সাপ্তাহিক পর্যায়কাল)। আমার প্রধান সমস্যাগুলি হ'ল: 1) এটি রূপান্তর করতে খুব ধীর (এটির জন্য অনেক historicalতিহাসিক ডেটা প্রয়োজন) এবং আমার একটি প্রতিক্রিয়াশীল, অনলাইন পদ্ধতির প্রয়োজন; 2) স্মৃতি ব্যবহারের দৃষ্টিকোণ থেকে এটি নরকের মতো অদক্ষ; 3) এটি মোটেও শক্তিশালী নয়;
জিয়ানলুকা

ধন্যবাদ. দুর্ভাগ্যক্রমে, এটি এখনও যেমনটি আশা করি তেমন কাজ করে না। পূর্ববর্তী মন্তব্যের একই সময়ের সিরিজের জন্য এটি 166 ফেরত দেয় যা কেবল আংশিকভাবে সঠিক (আমার দৃষ্টিকোণে, স্পষ্টত সাপ্তাহিক সময়কাল আরও আকর্ষণীয়)। এবং এইরকম একটি খুব শোরগোল সময় সিরিজ ব্যবহার করে dl.DPboxboxuu / 540394 / chart2.png (একটি টিসিপি রিসিভার উইন্ডো বিশ্লেষণ), ফাংশনটি 10 ​​ফিরে আসে, যখন আমি 1 প্রত্যাশা করব (আমি কোনও স্পষ্ট দেখতে পাচ্ছি না) পর্যাবৃত্তি)। বিটিডাব্লু আমি জানি যে আমি যা খুঁজছি তা পাওয়া সত্যিই কঠিন হবে, যেহেতু আমি খুব আলাদা সংকেত নিয়ে কাজ করছি।
gianluca

166 168 এর খারাপ অনুমান নয় you যদি আপনি জানেন যে সাপ্তাহিক প্যাটার্ন সহ ডেটা প্রতি ঘণ্টার সাথে পর্যবেক্ষণ করা হয় তবে কেন ফ্রিকোয়েন্সিটি মোটেও অনুমান করবেন?
রব হেন্ডম্যান

5
উন্নত সংস্করণটি পূর্বাভাস প্যাকেজে রয়েছেfindfrequency
রব হ্যান্ডম্যান

10

আপনি যদি প্রক্রিয়াটি স্থিতিশীল হওয়ার প্রত্যাশা করেন - সময়ের সাথে সাথে পর্যায় / seasonতু পরিবর্তন হবে না - তবে চি-বর্গের পিরিওডোগ্রামের মতো কিছু (যেমন, সোকলোভ এবং বুশেল, 1978 দেখুন) ভাল পছন্দ হতে পারে। এটি সাধারণত সার্কিয়ান ডেটা বিশ্লেষণে ব্যবহৃত হয় যা এতে প্রচুর পরিমাণে শব্দ হতে পারে তবে খুব স্থিতিকাল পর্যায়ক্রমে হবে বলে আশা করা যায়।

এই পদ্ধতির তরঙ্গরূপের আকৃতি সম্পর্কে কোনও ধারণা নেই (এটি চক্র থেকে অন্য চক্রের সাথে সামঞ্জস্যপূর্ণ) তবে কোনও ধরণের শব্দটি ধ্রুবক অর্থে হওয়া এবং সংকেতের সাথে সংযুক্ত না হওয়া প্রয়োজন।

chisq.pd <- function(x, min.period, max.period, alpha) {
N <- length(x)
variances = NULL
periods = seq(min.period, max.period)
rowlist = NULL
for(lc in periods){
    ncol = lc
    nrow = floor(N/ncol)
    rowlist = c(rowlist, nrow)
    x.trunc = x[1:(ncol*nrow)]
    x.reshape = t(array(x.trunc, c(ncol, nrow)))
    variances = c(variances, var(colMeans(x.reshape)))
}
Qp = (rowlist * periods * variances) / var(x)
df = periods - 1
pvals = 1-pchisq(Qp, df)
pass.periods = periods[pvals<alpha]
pass.pvals = pvals[pvals<alpha]
#return(cbind(pass.periods, pass.pvals))
return(cbind(periods[pvals==min(pvals)], pvals[pvals==min(pvals)]))
}

x = cos( (2*pi/37) * (1:1000))+rnorm(1000)
chisq.pd(x, 2, 72, .05)

শেষ দুটি লাইন কেবলমাত্র একটি উদাহরণ, এটি দেখিয়েছে যে এটি খাঁটি ত্রিকোণমিত্রিক ক্রিয়াকলাপের সময়কাল সনাক্ত করতে পারে এমনকি প্রচুর সংযোজনীয় শব্দের সাথেও।

যেমনটি লেখা আছে, alphaকলটিতে সর্বশেষ যুক্তি ( ) অতিমাত্রায় প্রোথিত, ফাংশনটি কেবল এটি খুঁজে পেতে পারে এমন 'সেরা' সময়টি ফিরিয়ে দেয়; প্রথম returnবিবৃতিটি নিঃশর্ত করুন এবং দ্বিতীয়টিতে মন্তব্য করুন যাতে এটি পর্যায়ে উল্লেখযোগ্য সমস্ত পিরিয়ডের একটি তালিকা ফেরত দেয় alpha

আপনি চিহ্নিতকরণের সময়সীমা রেখেছেন তা নিশ্চিত করার জন্য এই ফাংশনটি কোনও ধরণের বিচক্ষণতা যাচাই করে না, এবং এটি (এটি) ভগ্নাংশের সময়কালের সাথেও কাজ করে না, এবং যদি আপনি সিদ্ধান্ত নেন তবে কোনও ধরণের একাধিক তুলনা নিয়ন্ত্রণ তৈরি করা হয়নি একাধিক পিরিয়ড তাকান। তবে এর বাইরে এটি যুক্তিসঙ্গতভাবে দৃust় হওয়া উচিত।


আকর্ষণীয় দেখায় তবে আমি আউটপুটটি বুঝতে পারি না, পিরিয়ডটি কোথায় শুরু হয় তা আমাকে বলে না এবং বেশিরভাগ মান 1
হারমান টুথ্রোট

3

আপনি কী আরও স্পষ্টভাবে চান তা সংজ্ঞায়িত করতে চাইতে পারেন (নিজের কাছে, এখানে না থাকলে)। আপনি যা সন্ধান করছেন তা যদি আপনার কোলাহলপূর্ণ ডেটাতে থাকা সর্বাধিক পরিসংখ্যানগতভাবে উল্লেখযোগ্য স্থিতিকাল পর্যায় হয়, তবে নিতে হবে দুটি মূলত:

1) একটি শক্তিশালী স্বতঃসংশ্লিষ্ট হিসেব গণনা করুন, এবং সর্বাধিক সহগ গ্রহণ করুন
2) একটি শক্তিশালী শক্তি বর্ণালী ঘনত্বের অনুমান গণনা করুন, এবং সর্বোচ্চ বর্ণালী গ্রহণ করুন

# 2 এর সমস্যাটি হ'ল যে কোনও শোরগোল সময় সিরিজের জন্য আপনি স্বল্প ফ্রিকোয়েন্সিগুলিতে প্রচুর পরিমাণে বিদ্যুৎ পাবেন, এটি পার্থক্য করা শক্ত করে তোলে। এই সমস্যাটি সমাধান করার জন্য কিছু কৌশল রয়েছে (যেমন প্রাক-হোয়াইট, তারপরে পিএসডি অনুমান করুন) তবে আপনার ডেটা থেকে সত্য সময়টি যদি দীর্ঘ হয় তবে স্বয়ংক্রিয় সনাক্তকরণটি iffy হবে।

আপনার সেরা বাজি সম্ভবত একটি শক্তিশালী অটোক্রেলেশন রুটিন বাস্তবায়ন করা যেমন রোনস্ট স্ট্যাটিস্টিক্স - ম্যারোনা, মার্টিন এবং যোহাইয়ের থিয়োরি এবং পদ্ধতিগুলির 8.6, 8.7 অধ্যায়ে পাওয়া যায় । "মজবুত ডার্বিন-লেভিনসন" এর জন্য গুগল অনুসন্ধান করলেও কিছু ফল পাওয়া যাবে।

আপনি যদি কেবল একটি সহজ উত্তর খুঁজছেন, আমি নিশ্চিত যে এটির একটি বিদ্যমান। সময় সিরিজে পিরিয়ড সনাক্তকরণ জটিল হতে পারে এবং যাদু করতে পারে এমন একটি স্বয়ংক্রিয় রুটিনের জন্য জিজ্ঞাসা করা খুব বেশি হতে পারে।


আপনার মূল্যবান তথ্যগুলির জন্য আপনাকে ধন্যবাদ, আমি অবশ্যই সেই বইটি দেখব।
gianluca

3

আপনি আপনার ডেটার তাত্ক্ষণিক ফ্রিকোয়েন্সি পরিমাপ করতে ডিএসপি তত্ত্ব থেকে হিলবার্ট ট্রান্সফর্মেশন ব্যবহার করতে পারেন। সাইটটি http://ta-lib.org/ এ আর্থিক তথ্যের প্রভাবশালী চক্র সময়কাল পরিমাপের জন্য ওপেন সোর্স কোড রয়েছে; সম্পর্কিত ফাংশন বলা হয় HT_DCPERIOD; আপনি এটি ব্যবহার করতে সক্ষম হতে পারেন বা কোডটিকে আপনার উদ্দেশ্যগুলিতে অভিযোজিত করতে পারেন।


3

একটি ভিন্ন পদ্ধতির ইমিরিকাল মোড পচন হতে পারে। আর প্যাকেজটিকে পদ্ধতির উদ্ভাবক দ্বারা বিকশিত ইএমডি বলা হয়:

require(EMD)
ndata <- 3000  
tt2 <- seq(0, 9, length = ndata)  
xt2 <- sin(pi * tt2) + sin(2* pi * tt2) + sin(6 * pi * tt2) + 0.5 * tt2  
try <- emd(xt2, tt2, boundary = "wave")  
### Ploting the IMF's  
par(mfrow = c(try$nimf + 1, 1), mar=c(2,1,2,1))  
rangeimf <- range(try$imf)  
for(i in 1:try$nimf) {  
plot(tt2, try$imf[,i], type="l", xlab="", ylab="", ylim=rangeimf, main=paste(i, "-th IMF", sep="")); abline(h=0)  
}  
plot(tt2, try$residue, xlab="", ylab="", main="residue", type="l", axes=FALSE); box()

পদ্ধতিটি একটি ভাল কারণে 'এম্পিরিকাল' হিসাবে চিহ্নিত করা হয়েছিল এবং এতে একটি ঝুঁকি রয়েছে যে অন্তর্নিহিত মোড ফাংশনগুলি (স্বতন্ত্র অ্যাডিটিভ উপাদানগুলি) মিশ্রিত হয়। অন্যদিকে পদ্ধতিটি খুব স্বজ্ঞাত এবং চক্রবৃদ্ধির একটি চাক্ষুষ দর্শনের জন্য সহায়ক হতে পারে।


0

উপরে রব হ্যান্ডম্যানের পোস্টের উপরে উল্লেখ https://stats.stackexchange.com/a/1214/70282

Find.freq ফাংশনটি দুর্দান্তভাবে কাজ করে। আমি যে দৈনিক ডেটা সেটটি ব্যবহার করছি তাতে এটি 7 এর ফ্রিকোয়েন্সিটি সঠিকভাবে কাজ করেছে।

আমি যখন কেবল সপ্তাহের দিনগুলিতে চেষ্টা করেছি, তখন এটি উল্লেখ করেছে যে ফ্রিকোয়েন্সিটি 23, যা উল্লেখযোগ্যভাবে 21.42857 = 29.6 * 5/7 এর কাছাকাছি যা এক মাসে কাজের দিনগুলির গড় সংখ্যা। (অথবা বিপরীতে 23 * 7/5 হল 32.)

আমার প্রতিদিনের তথ্যের দিকে ফিরে তাকালে, আমি প্রথম পিরিয়ড গ্রহণের, এমনটি গড়ে গড়ে এবং তারপরে পরবর্তী সময়কালের সন্ধানের জন্য একটি কুঁচকির সাথে পরীক্ষা করেছিলাম below নীচে দেখুন:

find.freq.all = ফাংশন (x) এর {  
  F = find.freq (x) এর;
  freqs = C (চ);  
  যখন (চ> 1) {
    = 1 শুরু; # এছাড়াও চেষ্টা শুরু = চ;
    এক্স = period.apply (এক্স, SeQ (শুরু, দৈর্ঘ্য (x) চ) অর্থ); 
    F = find.freq (x) এর;
    freqs = C (freqs, চ);
  }
  if (দৈর্ঘ্য (freqs) == 1) {রিটার্ন (freqs); }
  জন্য (আমি 2 ইন: দৈর্ঘ্য (freqs)) {
    freqs [আমি] = freqs [আমি] * freqs [ই-1];
  }
  freqs [1: (দৈর্ঘ্য (freqs) -1)];
}
find.freq.all (দৈনিক) # প্রতিদিনের ডেটা ব্যবহার করে

উপরেরগুলি (7,28) বা (7,35) দেয় যদি সিক 1 বা f দিয়ে শুরু হয় তার উপর নির্ভর করে। (উপরের মন্তব্য দেখুন।)

যা বোঝায় যে এমএসটি (...) এর জন্য 7তু কালগুলি (7,28) বা (7,35) হওয়া উচিত।

অ্যালগরিদম পরামিতিগুলির সংবেদনশীলতা প্রদত্ত যুক্তি প্রাথমিক অবস্থার সাথে সংবেদনশীল প্রদর্শিত হয়। 28 এবং 35 এর গড় অর্থ 31.5 যা এক মাসের গড় দৈর্ঘ্যের কাছাকাছি।

আমার সন্দেহ হয় আমি চাকাটি নতুন করে এনেছি, এই অ্যালগরিদমের নাম কী? কোথাও আর এর থেকে আরও ভাল বাস্তবায়ন আছে?

পরে, আমি 1 থেকে 7 এর সমস্ত শুরুর চেষ্টা করে উপরের কোডটি চালিয়েছি এবং আমি দ্বিতীয় সময়ের জন্য 35,35,28,28,28,28,28 পেয়েছি। গড় 30 এর উপরে কাজ করে যা এক মাসে দিনের গড় সংখ্যা। মজাদার...

কোন চিন্তা বা মন্তব্য?


0

যে কোনও মৌসুমী পার্থক্য সর্বোত্তম স্তরের দিকে পৌঁছেছে তা নির্ধারণের জন্য লজং-বক্স পরীক্ষাও ব্যবহার করতে পারেন। আমি একটি ভিন্ন বিষয়ে কাজ করছিলাম এবং আমি এটি একই উদ্দেশ্যে ব্যবহার করেছি। একটি মাসিক ডেটার জন্য 3 থেকে 24 এর মতো বিভিন্ন সময়সীমার চেষ্টা করুন। এবং তাদের প্রত্যেককে ল্যাং-বক্স দ্বারা পরীক্ষা করুন এবং চি-স্কোয়ারের ফলাফলগুলি সঞ্চয় করুন। এবং সর্বনিম্ন চি-বর্গ মানের সহ সময়কালটি চয়ন করুন।

এটি করার জন্য এখানে একটি সাধারণ কোড।

minval0 <- 5000 #assign a big number to be sure Chi values are smaller
minindex0 <- 0
periyot <- 0

for (i in 3:24) { #find optimum period by Qtests over original data

        d0D1 <- diff(a, lag=i)

        #store results
        Qtest_d0D1[[i]] <- Box.test(d0D1, lag=20, type = "Ljung-Box")

        #store Chi-Square statistics
        sira0[i] <- Qtest_d0D1[[i]][1]
}
#turn list to a data frame, then matrix
datam0 <- data.frame(matrix(unlist(sira0), nrow=length(Qtest_d0D1)-2, byrow = T))
datamtrx0 <- as.matrix(datam0[])
#get min value's index
minindex0 <- which(datamtrx0 == min(datamtrx0), arr.ind = F)
periyot <- minindex0 + 2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.