আমি কীভাবে দুটি সিগন্যাল প্রান্তিক / সংহত করতে পারি?


21

আমি কিছু গবেষণা করছি তবে বিশ্লেষণের পর্যায়ে এসেছি (আমার পরিসংখ্যানের বক্তৃতাগুলিতে আরও মনোযোগ দেওয়া উচিত ছিল)।

আমি দুটি যুগপত সংকেত সংগ্রহ করেছি: ভলিউম এবং বুকের প্রসারণের পরিবর্তনের জন্য সংহত প্রবাহের হার। আমি সংকেতগুলির তুলনা করতে চাই এবং শেষ পর্যন্ত বুকের সম্প্রসারণ সংকেত থেকে ভলিউম প্রাপ্ত করার আশা করি। তবে প্রথমে আমার ডেটা সারিবদ্ধ / সিঙ্ক্রোনাইজ করতে হবে।

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

আমি দুটি সিগন্যালের একটি উদাহরণ সংযুক্ত করেছি ( https://docs.google.com/spreadsheet/ccc?key=0As4oZTKp4RZ3dFRKaktYWEhZLXlFbFVKNmllbGVXNHc ) দয়া করে আমাকে আরও কিছু সরবরাহ করতে পারে কিনা তা আমাকে জানান।


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

1
আপনি কি ইতিমধ্যে আপনার সমস্ত ডেটা সংগ্রহ করেছেন? এটি কি এক পাইলট বিষয়? আপনি যদি এখনই শুরু করছেন, আমি আপনার বেল্ট থেকে সিগন্যালটি বিভক্ত করার এবং আপনার প্রবাহের রেকর্ডিংটিকে ট্রিগার হিসাবে (বা এমনকি কেবল একটি টাইমস্ট্যাম্প চিহ্নিত করতে) ব্যবহার করতে চাই। সাধারণত অধিগ্রহণ সিস্টেমগুলির সহায়তার বা ট্রিগার পোর্ট সহ এই ক্ষমতা থাকে। আমি নিশ্চিত যে ম্যাক্রো যেমন প্রস্তাব করেছে ঠিক তেমনভাবে আপনার ডেটা ব্যবহার করে আলাদা করার উপায় রয়েছে তবে এই অতিরিক্ত পদক্ষেপটি যুক্ত করা অনেক অনুমানের কাজটি সরিয়ে নেবে।
jonsca

1
আমি মনে করি, আপনি কেবলমাত্র একটি স্থির দেরি অনুমান করতে চান। আপনি ক্রস কোরিলেশন ব্যবহার করতে পারে এখানে রূপরেখা: stats.stackexchange.com/questions/16121/...
thias

1
আপনি এই প্রশ্নটি ডিএসপি.এসইতে জিজ্ঞাসা করতে চাইতে পারেন যেখানে তারা সংকেতগুলির সিঙ্ক্রোনাইজেশন সম্পর্কেও ভাবেন।
দিলিপ সরোতে

1
@ থিয়াস সঠিক, তবে এটি মনে হচ্ছে যে প্রথম একটি সিরিজ পুনরায় করা উচিত যাতে তাদের অন্তর অন্তর থাকে।
শুক্র

উত্তর:


24

প্রশ্নটি জিজ্ঞাসা করে যে সিরিজটি নিয়মিত কিন্তু বিভিন্ন বিরতিতে যখন নমুনা দেওয়া হয় তখন কীভাবে এক সময়ের সিরিজ ("সম্প্রসারণ") আরেকটি ("ভলিউম") পিছিয়ে যায় সেই পরিমাণটি কীভাবে সন্ধান করতে হয় ।

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


উদাহরণস্বরূপ , আমরা Rসিউডোকোডের জন্য নিয়োগ দিয়ে প্রশ্নে সরবরাহিত ডেটা ব্যবহার করতে পারি । আসুন প্রাথমিক কার্যকারিতা, ক্রস-সম্পর্ক এবং পুনরায় মডেলিং দিয়ে শুরু করা যাক:

cor.cross <- function(x0, y0, i=0) {
  #
  # Sample autocorrelation at (integral) lag `i`:
  # Positive `i` compares future values of `x` to present values of `y`';
  # negative `i` compares past values of `x` to present values of `y`.
  #
  if (i < 0) {x<-y0; y<-x0; i<- -i}
  else {x<-x0; y<-y0}
  n <- length(x)
  cor(x[(i+1):n], y[1:(n-i)], use="complete.obs")
}

এটি একটি অশোধিত অ্যালগরিদম: একটি এফএফটি-ভিত্তিক গণনা দ্রুত হবে। তবে এই ডেটাগুলির জন্য (প্রায় 4000 মান জড়িত) এটি যথেষ্ট ভাল।

resample <- function(x,t) {
  #
  # Resample time series `x`, assumed to have unit time intervals, at time `t`.
  # Uses quadratic interpolation.
  #
  n <- length(x)
  if (n < 3) stop("First argument to resample is too short; need 3 elements.")
  i <- median(c(2, floor(t+1/2), n-1)) # Clamp `i` to the range 2..n-1
  u <- t-i
  x[i-1]*u*(u-1)/2 - x[i]*(u+1)*(u-1) + x[i+1]*u*(u+1)/2
}

আমি ডেটাটি কমা-বিচ্ছিন্ন সিএসভি ফাইল হিসাবে ডাউনলোড করেছি এবং এর শিরোনামটি কেড়ে ফেলেছি। (শিরোনামটি আর এর জন্য কিছু সমস্যা সৃষ্টি করেছিল যা আমি নির্ণয় করতে পাত্তাই নি।)

data <- read.table("f:/temp/a.csv", header=FALSE, sep=",", 
                    col.names=c("Sample","Time32Hz","Expansion","Time100Hz","Volume"))

এনবি এই সমাধানটি ধরে নিয়েছে যে প্রতিটি সিরিজ ডেটা অস্থায়ী ক্রমানুসারে একটির মধ্যে কোনও ফাঁক নেই। এটি এটি সময়ের জন্য প্রক্সি হিসাবে মানগুলিতে সূচকগুলি ব্যবহার করতে এবং সেই সূচিগুলিকে টেম্পোরাল স্যাম্পলিং ফ্রিকোয়েন্সিগুলি সময়ে সময়ে রূপান্তর করতে স্কেল করতে দেয়।

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

n.clip <- 350      # Number of terminal volume values to eliminate
n <- length(data$Volume) - n.clip
indexes <- 1:n
v <- residuals(lm(data$Volume[indexes] ~ indexes))
expansion <- residuals(lm(data$Expansion[indexes] ~ indexes)

ফলাফলটি থেকে সর্বাধিক নির্ভুলতা পেতে আমি কম- নিয়মিত সিরিজের পুনরায় নমুনা করি ।

e.frequency <- 32  # Herz
v.frequency <- 100 # Herz
e <- sapply(1:length(v), function(t) resample(expansion, e.frequency*t/v.frequency))

এখন ক্রস-পারস্পরিক সম্পর্ক গণনা করা যেতে পারে - দক্ষতার জন্য আমরা কেবল ল্যাগগুলির একটি যুক্তিসঙ্গত উইন্ডো অনুসন্ধান করি - এবং যেখানে সর্বোচ্চ মান পাওয়া যায় সেই ল্যাগটি সনাক্ত করা যায়।

lag.max <- 5       # Seconds
lag.min <- -2      # Seconds (use 0 if expansion must lag volume)
time.range <- (lag.min*v.frequency):(lag.max*v.frequency)
data.cor <- sapply(time.range, function(i) cor.cross(e, v, i))
i <- time.range[which.max(data.cor)]
print(paste("Expansion lags volume by", i / v.frequency, "seconds."))

আউটপুট আমাদের বলে যে সম্প্রসারণের ভলিউমটি 1.85 সেকেন্ডের মধ্যে পড়ে। (যদি শেষ 3.5 সেকেন্ডের ডেটা ক্লিপ না করা হয় তবে আউটপুটটি 1.84 সেকেন্ড হবে))

বেশিরভাগ উপায়ে দৃশ্যমানভাবে সমস্ত কিছু পরীক্ষা করা ভাল ধারণা। প্রথমত, ক্রস-সম্পর্ক সম্পর্কিত ফাংশন :

plot(time.range * (1/v.frequency), data.cor, type="l", lwd=2,
     xlab="Lag (seconds)", ylab="Correlation")
points(i * (1/v.frequency), max(data.cor), col="Red", cex=2.5)

পারস্পরিক সম্পর্ক প্লট

এরপরে, দুটি সিরিজ সময় মতো নিবন্ধভুক্ত করুন এবং তাদের একই অক্ষগুলিতে একসাথে প্লট করুন

normalize <- function(x) {
  #
  # Normalize vector `x` to the range 0..1.
  #
  x.max <- max(x); x.min <- min(x); dx <- x.max - x.min
  if (dx==0) dx <- 1
  (x-x.min) / dx
}
times <- (1:(n-i))* (1/v.frequency)
plot(times, normalize(e)[(i+1):n], type="l", lwd=2, 
     xlab="Time of volume measurement, seconds", ylab="Normalized values (volume is red)")
lines(times, normalize(v)[1:(n-i)], col="Red", lwd=2)

প্লট নিবন্ধিত

দেখতে বেশ সুন্দর লাগছে! যদিও আমরা স্ক্যাটারপ্লোটের সাথে নিবন্ধের মানের আরও ভাল ধারণা পেতে পারি । অগ্রগতিটি দেখানোর জন্য আমি রঙের সাথে সময় পরিবর্তন করি।

colors <- hsv(1:(n-i)/(n-i+1), .8, .8)
plot(e[(i+1):n], v[1:(n-i)], col=colors, cex = 0.7,
     xlab="Expansion (lagged)", ylab="Volume")

Scatterplot

আমরা একটি লাইনের সাথে সামনে এবং পিছনে ট্র্যাক করার জন্য পয়েন্টগুলি সন্ধান করছি: যা থেকে ভিন্নতাগুলি ভলিউমে প্রসারণের সময়-পিছনে প্রতিক্রিয়াতে অরেখার প্রতিফলন করে। যদিও কিছু ভিন্নতা রয়েছে তবে সেগুলি বেশ ছোট। তবুও, সময়ের সাথে এই বিভিন্নতাগুলি কীভাবে পরিবর্তিত হয় তা কিছু শারীরবৃত্তীয় আগ্রহের কারণ হতে পারে। পরিসংখ্যান, বিশেষত এর অনুসন্ধান এবং দৃষ্টিভঙ্গি দিক সম্পর্কে দুর্দান্ত জিনিস হ'ল এটি কীভাবে দরকারী উত্তরের পাশাপাশি ভাল প্রশ্ন এবং ধারণা তৈরি করতে ঝোঁক


1
পবিত্র জাহান্নাম, তুমি আশ্চর্য! ক্রস-পারস্পরিক সম্পর্ক হ'ল আমি যা কল্পনা করছিলাম (আমি জানতাম যে এর একটি নাম থাকতে হবে) তবে আপনার উত্তর / ব্যাখ্যা উপরে এবং অতিক্রম করে গেছে। অনেক ধন্যবাদ!
157

আমার কাছে এখন পুরো ব্যাখ্যার জন্য সময় নেই, তবে "সংখ্যার রেসিপি" বইগুলিতে একটি দুর্দান্ত অ্যাকাউন্ট উপস্থিত রয়েছে। উদাহরণস্বরূপ, সিসিতে সংখ্যাসূচক রেসিপিগুলিতে ১৩.২ অধ্যায়, "এফএফটি ব্যবহার করে স্বীকৃতি এবং স্বতঃসংশোধন" দেখুন । আপনি আর এর acfফাংশনটিও দেখতে পারেন।
হোবার

'আর' তে নতুন, দয়া করে দয়া করুন: সম্মিলিত প্লটে ব্যবহৃত 'নরমালাইজ' ফাংশন (২ য় শেষ প্লট) আমার পক্ষে কাজ করবে না, এই উত্তর পোস্ট হওয়ার পরে এই ফাংশনটির কোনও আপডেট আছে?
সিএমকেন্ডি

1
@CmKndy আমিও তখন নতুন ছিলাম Rযখন আমি এই উত্তরটি পোস্ট করেছিলাম এবং ঠিক তখনই এই কার্যটির জন্য একটি সংজ্ঞা সরবরাহ করতে ভুলে গিয়েছিলাম। এখানে আসলটি রয়েছে:normalize <- function(x) { x.max <- max(x); x.min <- min(x); dx <- x.max - x.min; if (dx==0) dx <- 1; (x-x.min) / dx }
শুক্রবার

নিখুঁত, আপনাকে ধন্যবাদ আপনি আর-তে নতুন থাকাকালীন যদি এই জাতীয় কোনও উত্তর পোস্ট করতে পারতেন, তবে আমি যা ভাবা হয়েছিল তার চেয়েও নতুন;)
সিএমকেন্ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.