2017-01-26 339 views
0

我試圖在R中使用lm函數對多個正弦波(精確到三個)進行擬合。我能夠得到一個結果,但它看起來很遠糾正:使用線性迴歸擬合多個正弦波(R)

Sine wave fit to data

綠線是有點兒發抖,因爲它應該是,但它似乎只是一個單一的正弦(加入拋物線),並且不會將數據匹配得很好。我究竟做錯了什麼?

我使用的代碼:(該週期是硬編碼的,因爲它們被給我另外,timetopdh是以秒計的時間,heightdh水位在某一時間點)

plot(timetopdh,heightopdh,xlim=topvector, ylim = c(0,270)) 

period1 <- 545 
period2 <- 205 
period3 <- 85 

sin11 <- sin(2*pi/period1*timetopdh) 
sin12 <- cos(2*pi/period1*timetopdh) 

sin21 <- sin(2*pi/period2*timetopdh) 
sin22 <- cos(2*pi/period2*timetopdh) 

sin31 <- sin(2*pi/period3*timetopdh) 
sin32 <- cos(2*pi/period3*timetopdh) 

lmsinus <- lm(heightopdh ~ poly(timetopdh,2) + sin11 + sin12 + sin21 + sin22 + sin31 + sin32) 

fitted_for_lines <- fitted(lmsinus) 
pred <- predict(lmsinus, newdata=data.frame(timetopdh = timetopdh)) 
lines(timetopdh, pred, col=3, lwd=3) 

回答

1

這是非常匹配的,它不應該嚴格按照數據。一個線性模型應該創造出最佳的(直線)擬合,它可以儘可能地減少Y的變化。綠線完全符合你的要求(雖然不是直的)

你只有一條線,因爲你只需要一條線。時間和高度是按照他們存儲在列表中並傳遞到繪圖的順序相對於彼此繪製的點。

該線是使用提供的數據從預測中得出的,但是這些點來自其他兩組; timetopdh,heightopdh。如果你想要打印出正弦波,那麼你需要詢問每一個,但使用適當的圖形方法爲它們命名,通常是線圖。

+0

你說得對,我不應該指望這個健美是完美的。然而,我的意思是,似乎迴歸只考慮三個正弦波中的一個,因爲綠線看起來與標準正弦波非常相似。 你能詳細說明你最後一句話的含義嗎(「你需要詢問每一個,但名稱......」)? – Pandaqi

+0

我沒有看到你在哪裏輸入實際的sin變量來繪製,只是一組高度和時間數據。 (我看不到數據以知道這些文件中的內容)。如果你想讓R繪製其中三個計算的正弦波,然後明確地將其推入「plot(sin31),然後添加許多你希望的以及預測線。 – sconfluentus

+0

如果這些文件具有所有的點,那麼這些波以某種方式重疊,並且散點圖隱藏了各個運動。如果您從每個波形路徑中拉出點,並將它們繪製爲線。如果彼此不同並且AB線將比原始點更加明顯 - 連接點會告訴更多故事。 – sconfluentus