Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ggplot上拟合r中活动数据的正弦波_R_Ggplot2_Trigonometry - Fatal编程技术网

如何在ggplot上拟合r中活动数据的正弦波

如何在ggplot上拟合r中活动数据的正弦波,r,ggplot2,trigonometry,R,Ggplot2,Trigonometry,我有一个大型数据集的活动数据,我正试图拟合一个正弦波,以找到相应的活动高峰和低谷的时间点。数据不一定是正弦曲线,这可能是个问题,但我还是想拟合一条曲线。当涉及到节奏数据和数据分析时,我也是一个新手,所以请随时提供新的信息或建议。这里有一个链接,指向第一周鼠标的数据 id-eday-act-t 1:M001 11786400 2:M001 1 10 86460 3:M001 11386520 4:M001 114 86580 5:M001 12486640 ---

我有一个大型数据集的活动数据,我正试图拟合一个正弦波,以找到相应的活动高峰和低谷的时间点。数据不一定是正弦曲线,这可能是个问题,但我还是想拟合一条曲线。当涉及到节奏数据和数据分析时,我也是一个新手,所以请随时提供新的信息或建议。这里有一个链接,指向第一周鼠标的数据

id-eday-act-t
1:M001 11786400
2:M001 1 10 86460
3:M001 11386520
4:M001 114 86580
5:M001 12486640
---                          
10076:M001 7 0 690900
10077:M001 71690960
10078:M001 7 0 691020
10079:M001 7 0 691080
10080:M001 7 0 691140
我遵循的指导,并得到了一个像样的图表,虽然波似乎没有高峰和低谷每天。我希望把它叠加在ggplot散点图上

# here I fit a wave using lm()
lmfit <- lm(data = dt,
            act ~ sin(2*pi*t/365.25) + cos(2*pi*t/365.25))
# then get relevant parameters
b0 <- coef(lmfit)[1]
alpha <- coef(lmfit)[2]
beta <- coef(lmfit)[3]

r <- sqrt(alpha^2 + beta^2)
phi <- atan2(beta, alpha)

# and fit it to some base plots
par(mfrow=c(1,2))
curve(b0 + r * sin(x + phi), 0, 2*pi, lwd=3, col="Gray",
      main="Overplotted Graphs", xlab="x", ylab="y")
curve(b0 + alpha * sin(x) + beta * cos(x), lwd=3, lty=3, col="Red", add=TRUE)
curve(b0 + r * sin(x + phi) - (b0 + alpha * sin(x) + beta * cos(x)), 
      0, 2*pi, n=257, lwd=3, col="Gray", main="Difference", xlab="x", y="")
#这里我用lm()拟合了一个波浪

lmfit像这样,您可以将拟合曲线覆盖在ggplot散点图上(我改编了以下代码):

库(扫帚)
图书馆(dplyr)
#这里我用lm()拟合了一个波浪
lmfit%augment)%%>%
ggplot(aes(t,act…3))+
几何点()+
geom_色带(aes(ymin=.fitted-1.96*.se.fit,ymax=.fitted+1.96*.se.fit),alpha=0.5)+geom_线(mapping=aes(y=.fitted),col=“红色”)

您的主要问题是,您需要以秒为单位测量时间,并且需要一个每日周期,但您使用的代码假定时间以天为单位,并且需要一个年度周期

x <- read.csv("stack_sine_dt.csv")

secs_per_day <- 24*3600
x$tday <- x$t/secs_per_day
lmfit <- lm(data = x,
            act ~ sin(2*pi*tday) + cos(2*pi*tday))
b0 <- coef(lmfit)[1]
alpha <- coef(lmfit)[2]
beta <- coef(lmfit)[3]

pframe <- data.frame(tday=seq(min(x$tday),max(x$tday),length=501))
pframe$act <- predict(lmfit,newdata=pframe)

library(ggplot2); theme_set(theme_bw())
ggplot(x,aes(tday,act))+
    geom_point(alpha=0.2) + geom_line(data=pframe,colour="red")

x是否可以为您的数据指定频率?看起来你的频率太低了。您可能希望使用频率不同的正弦和余弦的线性组合作为模型。在一天结束时,你会发现哪些术语是重要的。一旦我有更多的时间,我会仔细看看你的问题。用另一种方式来表达@slava kohut的问题:
t
用什么单位来度量?秒?您使用的代码假定
t
是以天为单位测量的……啊,谢谢!是的,以秒为单位。我应该说明的。嗨,本,谢谢你的回复。你的代码运行得非常好,但我不得不做一个小的修改。是否有理由指定pframe预测向量的长度不必与输入向量的长度相同。另一种选择是使用
pframe
library(broom)
library(dplyr)
# here I fit a wave using lm()
lmfit <- lm(data = dt,
            act ~ sin(2*pi*t/36500.25))

bind_cols(dt, lmfit %>% augment) %>% 
  ggplot(aes(t, act...3)) +
  geom_point() +
  geom_ribbon(aes(ymin = .fitted - 1.96*.se.fit, ymax = .fitted + 1.96*.se.fit), alpha = 0.5) + geom_line(mapping = aes(y = .fitted), col = "red")
x <- read.csv("stack_sine_dt.csv")

secs_per_day <- 24*3600
x$tday <- x$t/secs_per_day
lmfit <- lm(data = x,
            act ~ sin(2*pi*tday) + cos(2*pi*tday))
b0 <- coef(lmfit)[1]
alpha <- coef(lmfit)[2]
beta <- coef(lmfit)[3]

pframe <- data.frame(tday=seq(min(x$tday),max(x$tday),length=501))
pframe$act <- predict(lmfit,newdata=pframe)

library(ggplot2); theme_set(theme_bw())
ggplot(x,aes(tday,act))+
    geom_point(alpha=0.2) + geom_line(data=pframe,colour="red")