我告诉你原理。我不确定我使用了正确的方程式,但是由于您写了大约 4 个参数,我认为这就是您的意思。
我没有检查错误并将其留给您。您还应该进行非线性回归时应该使用的常规诊断。
fitfun<-function(p,d,a,b,c,d1){
beta_1 <- 2-b-c
beta_2 <- -(1-c)*(1-b)
beta_3 <- c*d1 + b*a
beta_4 <- -c*d1*(1-b) - b*a*(2-c)
beta_5 <- b*a*(1-c)
res <- as.numeric(filter(p,c(0,beta_1,beta_2),sides=1)) + #use filter to calculate lagged values
as.numeric(filter(d,c(0,beta_3,beta_4,beta_5),sides=1)) + c
res[-(1:3)] #to remove NAs
}
pfit<-df$p0[-(1:3)]
fit<-nls(pfit ~ fitfun(p0,d1,a,b,c,d),data=df,start=list(a=2,b=1,c=1,d=1))
summary(fit)
Formula: pfit ~ fitfun(p0, d1, a, b, c, d)
Parameters:
Estimate Std. Error t value Pr(>|t|)
a 0.13858 0.62064 0.223 0.823
b 0.21101 0.01594 13.237 <2e-16 ***
c 1.41492 0.03015 46.929 <2e-16 ***
d 0.09838 0.09098 1.081 0.280
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6.799 on 1043 degrees of freedom
Number of iterations to convergence: 7
Achieved convergence tolerance: 5.107e-06
编辑
我很快展示了它是如何filter
工作的。
x <- 1:10
#[1] 1 2 3 4 5 6 7 8 9 10
filter(x,c(0,1),sides=1) #1*x_{i-1}
#[1] NA 1 2 3 4 5 6 7 8 9
filter(x,c(0,0,2),sides=1) #2*x_{i-2}
#[1] NA NA 2 4 6 8 10 12 14 16
filter(x,c(1,2,3),sides=1) #1*x_i + 2*x_{i-1} + 3*x_{i-2}
#[1] NA NA 10 16 22 28 34 40 46 52
filter
是一个时间序列函数,因此非常快。