ডেটাতে সাইনোসয়েডাল পদটি ফিট করুন


26

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

আমার কাছে নিম্নলিখিত তথ্য রয়েছে:

y <- c(11.622967, 12.006081, 11.760928, 12.246830, 12.052126, 12.346154, 12.039262, 12.362163, 12.009269, 11.260743, 10.950483, 10.522091,  9.346292,  7.014578,  6.981853,  7.197708,  7.035624,  6.785289, 7.134426,  8.338514,  8.723832, 10.276473, 10.602792, 11.031908, 11.364901, 11.687638, 11.947783, 12.228909, 11.918379, 12.343574, 12.046851, 12.316508, 12.147746, 12.136446, 11.744371,  8.317413, 8.790837, 10.139807,  7.019035,  7.541484,  7.199672,  9.090377,  7.532161,  8.156842,  9.329572, 9.991522, 10.036448, 10.797905)
t <- 18:65

এবং এখন আমি কেবল একটি সাইন ওয়েভ ফিট করতে চাই

y(t)=Asin(ωt+ϕ)+C.

চারটি অজানা সাথে , , এবং এটি।Aϕ সিωϕC

আমার কোডের বাকী অংশগুলি নীচে রয়েছে

res <- nls(y ~ A*sin(omega*t+phi)+C, data=data.frame(t,y), start=list(A=1,omega=1,phi=1,C=1))
co <- coef(res)

fit <- function(x, a, b, c, d) {a*sin(b*x+c)+d}

# Plot result
plot(x=t, y=y)
curve(fit(x, a=co["A"], b=co["omega"], c=co["phi"], d=co["C"]), add=TRUE ,lwd=2, col="steelblue")

তবে ফলাফলটি খুব খারাপ।

সাইন ফিট

আমি কোন সাহায্যের খুব প্রশংসা করব

চিয়ার্স।


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

5
আপনি কি বিভিন্ন শুরুর মান চেষ্টা করেছেন? আপনার ক্ষতির ফাংশন অ উত্তল, সুতরাং বিভিন্ন প্রারম্ভিক মানগুলি বিভিন্ন সমাধানের দিকে নিয়ে যেতে পারে।
স্টেফান বাজি

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

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

(আমি কেবল অজানা সময়ের নির্দিষ্ট
কেসটিকে এটি ননরেখা

উত্তর:


18

যদি আপনি কেবল সম্পর্কে একটি ভাল অনুমান চান এবং এর স্ট্যান্ডার্ড ত্রুটি সম্পর্কে খুব বেশি যত্ন না রাখেন:ω

ssp <- spectrum(y)  
per <- 1/ssp$freq[ssp$spec==max(ssp$spec)]
reslm <- lm(y ~ sin(2*pi/per*t)+cos(2*pi/per*t))
summary(reslm)

rg <- diff(range(y))
plot(y~t,ylim=c(min(y)-0.1*rg,max(y)+0.1*rg))
lines(fitted(reslm)~t,col=4,lty=2)   # dashed blue line is sin fit

# including 2nd harmonic really improves the fit
reslm2 <- lm(y ~ sin(2*pi/per*t)+cos(2*pi/per*t)+sin(4*pi/per*t)+cos(4*pi/per*t))
summary(reslm2)
lines(fitted(reslm2)~t,col=3)    # solid green line is periodic with second harmonic

সাইন প্লট

(আরও ভাল ফিট এখনও সম্ভবত এই সিরিজের আউটলিয়ারদের কোনও উপায়ে তাদের প্রভাব হ্রাস করতে পারে))

---

যদি আপনি ওমেগায় অনিশ্চয়তার কিছু ধারণা চান তবে আপনি প্রোফাইল সম্ভাবনা ব্যবহার করতে পারেন ( পিডিএফ 1 , পিডিএফ 2 - প্রোফাইল সম্ভাবনা বা এর রূপগুলি থেকে আনুমানিক সিআই বা এসই পাওয়ার বিষয়ে উল্লেখগুলি খুঁজে পাওয়া শক্ত নয়)ω

(বিকল্পভাবে, আপনি এই অনুমানগুলিকে এনএলএসে ফিড করতে পারেন ... এবং এটি ইতিমধ্যে রূপান্তর শুরু করতে পারেন))


(+1) সুন্দর উত্তর। আমি লিনিয়ার মডেলটির সাথে ফিট করার চেষ্টা করেছি lm(y~sin(2*pi*t)+cos(2*pi*t)তবে এটি কার্যকর হয়নি ( cosশব্দটি সর্বদা 1 ছিল)। কৌতূহলের বাইরে: প্রথম দুটি লাইন কী করে (আমি জানি spectrumবর্ণালী ঘনত্বের অনুমান করে)?
COOLSerdash

1
@COOLSerdash হ্যাঁ, আপনি একক আছে জন্য সময়ের হচ্ছে (যেমন লিঙ্ক প্রশ্নে ছিল না) কাজ। আমার ফিরে যাওয়া উচিত এবং অন্য উত্তরে এটিতে জোর দেওয়া উচিত। (সিটিডি)t2*pi*t
গ্লেন_বি -রাইনস্টেট মনিকা

1
@ কোলসারড্যাশ (সিটিডি) - ২ য় লাইনটি বর্ণালীতে বৃহত্তম চূড়ার সাথে সম্পর্কিত ফ্রিকোয়েন্সি খুঁজে এবং সময়টি সনাক্ত করার জন্য বিপরীতগুলি আবিষ্কার করে। কমপক্ষে এই ক্ষেত্রে (তবে আমি আরও বিস্তৃতভাবে সন্দেহ করি), এতে পূর্বনির্ধারিত সময়গুলি অবশ্যই সেই সময়কালকে চিহ্নিত করে যে সম্ভাবনাটিকে এত বেশি ঘনিষ্ঠ করে তোলে যে আমি সেই সময়ের আশেপাশের অঞ্চলে প্রোফাইল সম্ভাবনা সর্বাধিক করার জন্য আমার যে পদক্ষেপগুলি ছিল তা মুছে ফেলেছিলাম। specটিএসএ-তে ফাংশনটি আরও ভাল হতে পারে (এটি মনে হয় আরও বিকল্প রয়েছে যার মধ্যে একটি কখনও কখনও গুরুত্বপূর্ণ হতে পারে) তবে এই ক্ষেত্রে প্রধান শৃঙ্গটি ঠিক একই জায়গায় ছিল spectrumতাই আমি বিরক্ত করি নি।
গ্লেন_বি -রিনস্টেট মনিকা

@ Glen_b এই পদ্ধতিটি আমার ব্যবহারের ক্ষেত্রে বিস্ময়কর কাজ করে। আমি একটি কোসাইন্ (x) এর বক্ররেখা মাপসই প্রয়োজন, কিন্তু এটা কাজ হিসাবে ভাল না ... আমি পরিবর্তন reslmকরতে reslm <- lm(y ~ cos(2*pi/per*t)+tan(2*pi/per*t))কিন্তু এটি কি ঠিক হবে না। কোন ইঙ্গিত?
অমিত কোহলি

কেন আপনি সেখানে একটি ট্যান শব্দ আছে?
গ্লেন_বি -রিনস্টেট মনিকা

15

@ স্টেফান যেমন পরামর্শ দিয়েছে, বিভিন্ন প্রারম্ভিক মানগুলি নাটকীয়ভাবে ফিটকে উন্নত করে বলে মনে হচ্ছে। আমি ওমেগা প্রায় হওয়া উচিত বলে পরামর্শ দেওয়ার জন্য ডেটাগুলিকে চোখের পাতলা করেছিলাম , যেহেতু শিখরগুলি দেখতে প্রায় 20 ইউনিট আলাদা ছিল।2π/20

যখন আমি ঐ করা nls'র startতালিকা, আমি একটি বক্ররেখা যে আরো অনেক যুক্তিসংগত ছিল পেয়েছিলাম যদিও এটি এখনও কিছু নিয়মানুগ গোঁড়ামির হয়েছে।

এই ডেটা সেটটির সাথে আপনার লক্ষ্যটি কী তার উপর নির্ভর করে আপনি অতিরিক্ত শর্তাদি যোগ করে বা পর্যায়ক্রমিক কার্নেল সহ গাউসীয় প্রক্রিয়া জাতীয় ননপ্যারমেট্রিক পদ্ধতির সাহায্যে ফিটকে উন্নত করার চেষ্টা করতে পারেন।

সাইন ফিট

আরম্ভের মানটি স্বয়ংক্রিয়ভাবে নির্বাচন করা

আপনি যদি প্রভাবশালী ফ্রিকোয়েন্সি বাছাই করতে চান তবে আপনি একটি দ্রুত ফুরিয়ার ট্রান্সফর্ম (এফএফটি) ব্যবহার করতে পারেন। এটি আমার দক্ষতার ক্ষেত্রের বাইরে, সুতরাং আমি অন্যান্য লোকেরা তাদের পছন্দ করতে চাইলে বিশদটি পূরণ করতে দেব (বিশেষত ২ এবং ৩ পদক্ষেপ সম্পর্কে) তবে Rনীচের কোডটি কার্যকর করা উচিত।

# Step 1: do the FFT
raw.fft = fft(y)

# Step 2: drop anything past the N/2 - 1th element.
# This has something to do with the Nyquist-shannon limit, I believe
# (https://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem)
truncated.fft = raw.fft[seq(1, length(y)/2 - 1)]

# Step 3: drop the first element. It doesn't contain frequency information.
truncated.fft[1] = 0

# Step 4: the importance of each frequency corresponds to the absolute value of the FFT.
# The 2, pi, and length(y) ensure that omega is on the correct scale relative to t.
# Here, I set omega based on the largest value using which.max().
omega = which.max(abs(truncated.fft)) * 2 * pi / length(y)

abs(truncated.fft)অন্যান্য গুরুত্বপূর্ণ ফ্রিকোয়েন্সি রয়েছে কিনা তা দেখার জন্য আপনিও চক্রান্ত করতে পারেন, তবে আপনাকে এক্স-অক্ষের স্কেলিংটি কিছুটা কমিয়ে ফেলতে হবে।

এছাড়াও, আমি বিশ্বাস করি @ গ্লেইন_বি ঠিক যে ওমেগা জানার পরে সমস্যাটি উত্তল (বা সম্ভবত আপনাকে ফাইও জানা দরকার? আমি নিশ্চিত নই)। যাই হোক না কেন, অন্যান্য পরামিতিগুলির জন্য শুরুর মানগুলি ওমেগার মতো গুরুত্বপূর্ণ হওয়া উচিত নয় যদি তারা সঠিক বলপার্কে থাকে। আপনি সম্ভবত এফএফটি থেকে অন্যান্য পরামিতিগুলির শালীন অনুমান পেতে পারেন তবে কীভাবে এটি কাজ করবে তা আমি নিশ্চিত নই।


1
যে ইঙ্গিত জন্য ধন্যবাদ। শুধু একটু স্পষ্ট করার জন্য: ডেটা হ'ল মাইক্রোয়ারির একটি অংশ যাতে জিনের পর্যায়ক্রমিকতা সময়ের সাথে পরিমাপ করা হয়, অর্থাৎ প্রদর্শিত তথ্যটি একটি জিনের প্রকাশের ডেটা। এখন সমস্যাটি হ'ল আমি এই পদ্ধতিটি প্রায় 40 ক জিনের সমস্ত বিভিন্ন সময়সীমার এবং প্রশস্ততাগুলির ক্ষেত্রে প্রয়োগ করতে চাই। সুতরাং, এটি বেশ গুরুত্বপূর্ণ যে প্রাথমিক অবস্থার চেয়ে একটি ভাল ফিট পাওয়া যায়।
পাস্কল

1
ওপাগার জন্য স্বয়ংক্রিয়ভাবে শুরুর মানটি চয়ন করার জন্য @ পাসল আমার আপডেটগুলি উপরে প্রস্তাব দেখুন।
ডেভিড জে হ্যারিস

2
@ ডেভিডজে.হরিস আপনি লিনিয়ার মডেলটিতে ফাইও অনুমান করতে পারেন (ভাল, লিনিয়ার মডেলটিতে এটি এবং থেকে সরাসরি গণনা করুন ), ওপিতে লিঙ্কিত পোস্টটি দেখুন। ϕab
গ্লেন_বি -রিনস্টেট মনিকা

আমি ভাবছি যেখানে এক্স মানগুলি এখানে কার্যকর হয়। নিশ্চিত যে এটি ওমেগার জন্য একটি পার্থক্য করে, প্রদত্ত y মানগুলি 1 বা 5 x ধাপ দ্বারা পৃথক করা হয়, না?
7'14

1
প্রোগ্রামিং টিপ প্রশ্নের সাথে সম্পর্কিত নয়: আর অবজেক্ট হিসাবে নামকরণের সময় সতর্কতা foo.bar। এটি কীভাবে ক্লাসের জন্য পদ্ধতিগুলি নির্দিষ্ট করে তার কারণ এটি
ফায়ারব্যাগ

10

ইতিমধ্যে যা বলা হয়েছে তার বিকল্প হিসাবে, এটি লক্ষণীয় যে আরিমা মডেলগুলির শ্রেণীর একটি এআর (2) মডেল সাইন ওয়েভ প্যাটার্ন দিয়ে পূর্বাভাস তৈরি করতে ব্যবহার করা যেতে পারে।

একটি এআর (2) মডেল নিম্নরূপ লেখা যেতে পারে: যেখানে একটি ধ্রুবক, , অনুমিত হয় এবং a একটি এলোমেলো শক শব্দ। C ϕ 1 ϕ 2 a t

yt=C+ϕ1yt1+ϕ2yt2+at
Cϕ1ϕ2at

এখন, সমস্ত এআর (2) মডেল তাদের পূর্বাভাসে সাইন ওয়েভ প্যাটার্নগুলি ( স্টোকাস্টিক চক্র নামে পরিচিত ) তৈরি করে না তবে নিম্নলিখিত শর্তটি সন্তুষ্ট হলে এটি ঘটে:

ϕ12+4ϕ2<0.

পানরাটজ (1991) আমাদের স্টোকাস্টিক চক্র সম্পর্কে নিম্নলিখিত কথাগুলি বলে:

পূর্বাভাসের প্যাটার্নে স্টোকাস্টিক চক্র প্যাটার্নটি একটি বিকৃত সাইন ওয়েভ প্যাটার্ন হিসাবে ভাবা যেতে পারে: এটি স্টোকাস্টিক (সম্ভাব্য) সময়কাল, প্রশস্ততা এবং পর্যায় কোণ সহ একটি সাইন ওয়েভ।

এই জাতীয় মডেলটি auto.arima()কোনও এআর (2) মডেলের প্রস্তাব দেয় কিনা তা খুঁজে পেতে আমি পূর্বাভাস প্যাকেজ থেকে ফাংশনটি ব্যবহার করেছি এমন ডেটাতে লাগানো যায় কিনা তা দেখার জন্য। দেখা যাচ্ছে যে auto.arima()ফাংশনটি একটি এআরএমএ (2,2) মডেল প্রস্তাব করে; খাঁটি এআর (2) মডেল নয়, তবে এটি ঠিক আছে। এটি ঠিক আছে কারণ একটি এআরএমএ (2,2) মডেলটিতে একটি এআর (2) উপাদান থাকে, সুতরাং একই নিয়ম (স্টোকাস্টিক চক্র সম্পর্কে) প্রযোজ্য। যে, সাইন ওয়েভ পূর্বাভাস উত্পাদিত হবে কিনা তা দেখতে আমরা এখনও পূর্বোক্ত শর্তটি পরীক্ষা করতে পারি।

এর ফলাফলগুলি auto.arima(y)নীচে দেখানো হয়েছে।

Series: y 
ARIMA(2,0,2) with non-zero mean 

Coefficients:
         ar1      ar2      ma1     ma2  intercept
      1.7347  -0.8324  -1.2474  0.6918    10.2727
s.e.  0.1078   0.0981   0.1167  0.1911     0.5324

sigma^2 estimated as 0.6756:  log likelihood=-60.14
AIC=132.27   AICc=134.32   BIC=143.5

এখন শর্তটি পরীক্ষা করা যাক: এবং আমরা দেখতে যে শর্তটি সত্যই সন্তুষ্ট।

ϕ12+4ϕ2<01.73472+4(0.8324)<00.3202914<0

নীচের প্লটটি মূল সিরিজ, y, এআরএমএ (2,2) মডেলের ফিট এবং 14-নমুনা পূর্বাভাস দেখায়। যেমন দেখা যায়, নমুনার বাইরে থাকা পূর্বাভাসগুলি সাইন-ওয়েভ প্যাটার্ন অনুসরণ করে।

এখানে চিত্র বর্ণনা লিখুন

দুটি বিষয় মনে রাখবেন। 1) এটি একটি খুব দ্রুত বিশ্লেষণ (একটি স্বয়ংক্রিয় সরঞ্জাম ব্যবহার করে) এবং একটি সঠিক চিকিত্সা বক্স-জেনকিন্স পদ্ধতি অনুসরণ করে। 2) আরিমা পূর্বাভাস স্বল্প-মেয়াদী পূর্বাভাসে ভাল, সুতরাং আপনি উত্তরগুলি মডেলগুলি থেকে @ ডেভিড জে হ্যারিস এবং @ গ্লেন_ বি আরও নির্ভরযোগ্য হিসাবে দেখতে পেতে পারেন long

শেষ অবধি, আশা করি এটি ইতিমধ্যে কয়েকটি খুব তথ্যমূলক উত্তরের জন্য একটি দুর্দান্ত সংযোজন।

তথ্যসূত্র : ডায়নামিক রিগ্রেশন মডেলগুলির সাথে পূর্বাভাস: অ্যালান পঙ্ক্রাটজ, 1991, (জন উইলে এবং সন্স, নিউ ইয়র্ক), আইএসবিএন 0-471-61528-5


1

প্রদত্ত ডেটা সেটে পাপ বক্ররেখার জন্য বর্তমান পদ্ধতিগুলির জন্য পরামিতিগুলির প্রথম অনুমান করা প্রয়োজন, তারপরে একটি ইন্টারেক্টিভ প্রক্রিয়াটি হবে। এটি একটি অ-লিনিয়ার রিগ্রেশন সমস্যা। সুবিধাজনক অবিচ্ছেদ্য সমীকরণের জন্য অ লিনিয়ার রিগ্রেশনকে লিনিয়ার রিগ্রেশনকে রূপান্তর করার জন্য একটি ভিন্ন পদ্ধতি অন্তর্ভুক্ত। তারপরে, প্রাথমিক অনুমানের প্রয়োজন নেই এবং পুনরাবৃত্ত প্রক্রিয়াটির প্রয়োজন নেই: ফিটিংটি সরাসরি প্রাপ্ত হয়। Y = a + r * sin (w * x + phi) বা y = a + b * sin (w * x) + c * cos (w * x) ফাংশনের ক্ষেত্রে কাগজের 35-36 পৃষ্ঠা দেখুন "রেগ্রেশন সাইনোসয়েডেল" স্ক্রাইডে প্রকাশিত: http://www.scribd.com/JJacquelin/ ডকুমেন্টস Y = a + p * x + r * sin (w * x + phi) ফাংশনের ক্ষেত্রে: "মিশ্রিত রৈখিক এবং সাইনোসয়েডাল রিগ্রেশনগুলি" অধ্যায়ের 49-51 পৃষ্ঠা। আরও জটিল ক্রিয়াকলাপগুলির ক্ষেত্রে, সাধারণ প্রক্রিয়াটি "জেনারালাইজড সাইনোসয়েডাল রিগ্রেশন" পৃষ্ঠায় ৫-- ,১ অনুচ্ছেদে ব্যাখ্যা করা হয়েছে, তার পরে একটি সংখ্যার উদাহরণ y = r * পাপ (ডাব্লু * এক্স + ফাই) + (বি / এক্স) + সি * ln (x), পৃষ্ঠা 62-63


0

আপনি যদি আপনার কোসাইন-সন্ধানকারী ডেটার সর্বনিম্ন এবং সর্বোচ্চ পয়েন্টটি জানেন তবে আপনি সমস্ত কোসাইন সহগের গুণাগুণ করতে এই সাধারণ ফাংশনটি ব্যবহার করতে পারেন:

getMyCosine <- function(lowest_point=c(pi,-1), highest_point=c(0,1)){
  cosine <- list(
    T = pi / abs(highest_point[1] - lowest_point[1]),
    b = - highest_point[1],
    k = (highest_point[2] + lowest_point[2]) / 2,
    A = (highest_point[2] - lowest_point[2]) / 2
  )
  return(cosine)
}

এর নীচে সর্বনিম্ন এবং উষ্ণতম সময়ের জন্য সময় এবং তাপমাত্রার মানগুলি প্রবেশ করে, একটি কোসাইন ফাংশন সহ তাপমাত্রার বিভিন্নতা অনুকরণ করতে ব্যবহৃত হয়:

c <- getMyCosine(c(4,10),c(17,25)) 
# lowest temprature at 4:00 (10 degrees), highest at 17:00 (25 degrees)

x = seq(0,23,by=1);  y = c$A*cos(c$T*(x +c$b))+c$k ; 
library(ggplot2);   qplot(x,y,geom="step")

আউটপুট নীচে: কোসাইন সর্বনিম্ন এবং সর্বোচ্চ পয়েন্ট থেকে গণনা করা


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

সম্মত
হোন

0

আরেকটি বিকল্প জেনেরিক ফাংশন ব্যবহার করা হয় optim বা NLS। আমি উভয়েই চেষ্টা করেছি তাদের কেউই পুরোপুরি মজবুত নয়

নিম্নলিখিত ফাংশনগুলি y এ ডেটা নেয় এবং পরামিতি গণনা করে।

calc.period <- function(y,t)
{     
   fs <- 1/(t[2]-t[1])
   ssp <- spectrum(y,plot=FALSE )  
   fN <- ssp$freq[which.max(ssp$spec)]
   per <- 1/(fN*fs)
   return(per)
 }

fit.sine<- function(y, t)
{ 
  data <- data.frame(x = as.vector(t), y=as.vector(y))
  min.RSS <- function (data, par){
    with(data, sum((par[1]*sin(2*pi*par[2]*x + par[3])+par[4]-y )^2))
  }  
  amp = sd(data$y)*2.**0.5
  offset = mean(data$y)
  fest <- 1/calc.period(y,t)
  guess = c( amp, fest,  0,   offset)
  #res <- optim(par=guess, fn = min.RSS, data=data ) 
  r<-nls(y~offset+A*sin(2*pi*f*t+phi), 
     start=list(A=amp, f=fest, phi=0, offset=offset))
  res <- list(par=as.vector(r$m$getPars()))
  return(res)
}

 genSine <- function(t, params)
     return( params[1]*sin(2*pi*params[2]*t+ params[3])+params[4])

ব্যবহার নিম্নলিখিত:

t <- seq(0, 10, by = 0.01)
A <- 2 
f <- 1.5
phase <- 0.2432
offset <- -2

y <- A*sin(2*pi*f*t +phase)+offset + rnorm(length(t), mean=0, sd=0.2)

reslm1 <- fit.sine(y = y, t= t)

নিম্নলিখিত কোড ডেটা তুলনা করে

ysin <- genSine(as.vector(t), params=reslm1$par)
ysin.cor <- genSine(as.vector(t), params=c(A, f, phase, offset))

plot(t, y)
lines(t, ysin, col=2)
lines(t, ysin.cor, col=3)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.