2015-09-21 2 views
1

Я пытаюсь подогнать кривую синуса к линейным данным, следуя этому примеру, Sine curve fit using lm and nls in R, но я получаю смешной график, похожий на тот, который ниже моего кода. То, что я хотел бы, это просто синусоидальная кривая, соответствующая моим данным.Проблема с кривой синусоидальной кривой R

Data <- mrns[[1]] 
Time <- Data$time 
HR <- Data$raw.HR 

xc <- cos(2*pi*Time/366) 
xs <- sin(2*pi*Time/366) 
fit.lm <- lm(HR ~ xc+xs) 

pred <- predict(fit.lm, newdata=data.frame(Time=Time)) 

plot(HR ~ Time, data=Data, xlim=c(0, 2359)) 
lines(Time, pred, col="blue") 

То, что я получаю, это нижеприведенный сюжет, который не подходит моим данным. enter image description here Вот dput моих данных:

> dput(mrns[[1]]) 
structure(list(raw.HR = c(47L, 48L, 47L, 
47L, 49L, 46L, 47L, 51L, 50L, 52L, 49L, NA, 54L, NA, NA, 
NA, 76L, NA, 74L, NA, NA, 73L, 74L, 78L, 66L, 64L, 60L, NA, 
64L, NA, 62L, 62L, 65L, 61L, 60L, NA, 69L, 68L, 69L, NA, 
NA, 68L, 66L, NA, 77L, 70L, 73L, 72L, NA, 76L, NA, 74L, NA, 
75L, 72L, NA, 67L, 69L, 55L, 67L, NA, 69L, 64L, 71L, NA, 
64L, 59L, 55L, 54L, 50L, 74L, NA, 65L, 61L, 59L, NA, 68L, 
69L, NA, 65L, NA, 133L, 67L, 59L, 56L, 54L, 51L, 52L, 54L, 
53L, 52L, 57L, 46L), time = c(14, 44, 114, 144, 214, 
244, 314, 344, 414, 444, 514, 544, 546, 614, 617, 629, 631, 
644, 647, 659, 702, 714, 729, 744, 759, 814, 829, 844, 847, 
859, 902, 914, 929, 944, 959, 1014, 1017, 1029, 1044, 1059, 
1102, 1114, 1129, 1144, 1147, 1159, 1214, 1229, 1244, 1248, 
1259, 1301, 1314, 1317, 1329, 1344, 1347, 1359, 1544, 1546, 
1559, 1602, 1614, 1629, 1644, 1646, 1659, 1714, 1729, 1744, 
1759, 1814, 1817, 1829, 1844, 1859, 1902, 1914, 1929, 1931, 
1944, 1947, 1959, 2014, 2029, 2044, 2059, 2114, 2144, 2214, 
2244, 2314, 2344)), .Names = c("raw.HR", "time" 
), row.names = c(42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 
51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 
64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 
77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 
90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 7L, 8L, 9L, 
10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 
23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 
36L, 37L, 38L, 39L, 40L, 41L), class = "data.frame") 

Я не уверен, что еще попробовать в этой точке. У кого-нибудь есть предложения?

+2

Проблема с моделью нет кода. Вы заставляете период 366 с вашей линейной моделью – Dason

+0

Спасибо @Dason! Очевидно, я новичок в этом. Я не уверен, как выбрать хороший период для моих данных, я просто использовал 366, потому что это было в другом примере. Какие-либо предложения? – nchimato

+0

Ваш 'dput (...)' имеет только шесть строк. Где остальные данные? – jlhoward

ответ

1

Просто шучу. Я изменил период до 2359, который является максимальным временным интервалом, и кривая хорошо подходит для всех моих сюжетов. Спасибо @Dason за информацию!

Data <- mrns[[3]] 
Time <- Data$time 
HR <- Data$raw.HR 

xc <- cos(2*pi*Time/2359) 
xs <- sin(2*pi*Time/2359) 
fit.lm <- lm(HR ~ xc+xs) 

pred <- predict(fit.lm, newdata=data.frame(Time=Time)) 

plot(HR ~ Time, data=Data, xlim=c(0, 2359)) 
lines(Time, pred, col="blue") 
Смежные вопросы