주기적인 데이터에 맞는주기적인 스플라인


10

이 질문에 대한 의견 에서 사용자 @whuber는 주기적 데이터에 맞추기 위해 주기적 버전의 스플라인을 사용할 가능성을 인용했습니다. 이 방법, 특히 스플라인을 정의하는 방정식과 실제로 스플라인을 구현하는 방법에 대해 더 알고 싶습니다 (주로 R사용자이지만 MATLAB 또는 Python으로 필요할 수 있습니다). 또한 이것은 "좋은 것"이지만 삼각 다항식 피팅과 관련하여 가능한 장점 / 단점에 대해 아는 것이 좋을 것입니다. 이는 일반적으로 이러한 종류의 데이터를 처리하는 방법입니다 (응답이 매우 부드럽 지 않은 한, 이 경우 주기적 커널을 사용하여 가우시안 프로세스로 전환합니다).


2
다른 질문에 대한 답을 확인하십시오. stats.stackexchange.com/questions/225729/…
Haitao Du

@ hxd1011 감사합니다, 나는 팁을 주셔서 감사합니다. 결국 나는 데이터를 두 번 복제하여 동일한 데이터의 연속 세 세트를 가지고 스플라인을 중앙 1/3에 맞추기로 결정했습니다. 귀하가 참조하는 답변은 대체 솔루션으로도 나타납니다.
DeltaIV

1
@DeltaIV 귀하의 의견을 답변으로 변환하고 더 자세한 내용을 제공 할 수 있다면 좋은 답변이며 약간의 해결책을 제시하는 것이 좋습니다.
AdamO

@AdamO 제안에 감사드립니다. 그러나 올해 의이 시간 동안 나는 약간 늪입니다 :-) 그래도 시도 할 것입니다. 우선 그 코드를 검색해야합니다 ...
DeltaIV

답변:


5

스플라인은 회귀 모델링에서 복잡한 비선형 기능적 형태를 모델링하는 데 사용됩니다. 스플라인 스무딩 추세는 각 중단 점 또는 매듭에서 선행 계수가 변경되는 구간 별 연속 다항식으로 구성됩니다. 스플라인은 중단 점뿐만 아니라 트렌드의 다항식 정도로 지정 될 수 있습니다. 공변량의 스플라인 표현은 관측 값의 단일 벡터를 다항식 차수에 매듭 점 수를 더한 행렬로 확장합니다.

스플라인 의 주기적인 버전은 단순히 회귀의주기적인 버전 일뿐입니다. 데이터는주기 길이의 복제로 절단됩니다. 예를 들어, 쥐를 대상으로 한 일간 실험에서 일주일의 추세를 모델링하려면 실험 시간을 24 시간 단위로 다시 코딩해야하므로 154 시간은 모듈로 24 값 10 (154 = 6 * 24 + 10)이됩니다. 컷 데이터에 선형 회귀를 맞추면 트랜드에 대한 톱니 파형이 추정됩니다. 주기의 어딘가에 스텝 함수를 맞추면 시리즈에 맞는 방형 파형이됩니다. 스플라인은 훨씬 더 정교한 웨이블릿을 표현할 수 있습니다. 가치있는 것을 위해, splines패키지 periodicSpline에는 정확히 이것을 하는 기능 이 있습니다.

pnkpp+iinkSp+i=(Xki)pI(X<ki)k

myspline <- function(x, degree, knots) {
  knots <- sort(knots)
  val <- cbind(x, outer(x, knots, `-`))
  val[val < 0] <- 0
  val <- val^degree
  if(degree > 1)
    val <- cbind(outer(x, 1:{degree-1}, `^`), val)
  colnames(val) <- c(
    paste0('spline', 1:{degree-1}, '.1'),
    paste0('spline', degree, '.', seq(length(knots)+1))
  )
  val
}

2πτ

x <- seq(0, 2*pi, by=pi/2^8)
y <- sin(x)
plot(x,y, type='l')
s <- myspline(x, 2, pi)
fit <- lm(y ~ s)
yhat <- predict(fit)
lines(x,yhat)

당신은 그들이 매우 일치하는 것을 볼 수 있습니다. 또한 명명 규칙은 해석을 가능하게합니다. 회귀 출력에서 ​​다음을 볼 수 있습니다.

> summary(fit)

Call:
lm(formula = y ~ s)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.04564 -0.02050  0.00000  0.02050  0.04564 

Coefficients:
             Estimate Std. Error  t value Pr(>|t|)    
(Intercept) -0.033116   0.003978   -8.326 7.78e-16 ***
sspline1.1   1.268812   0.004456  284.721  < 2e-16 ***
sspline2.1  -0.400520   0.001031 -388.463  < 2e-16 ***
sspline2.2   0.801040   0.001931  414.878  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02422 on 509 degrees of freedom
Multiple R-squared:  0.9988,    Adjusted R-squared:  0.9988 
F-statistic: 1.453e+05 on 3 and 509 DF,  p-value: < 2.2e-16

π/2

데이터의 주기성을 알고 있다고 가정하겠습니다. 데이터에 성장 또는 이동 평균 성분이 부족한 경우 장시간 시계열을 1주기의 짧은 시리즈의 복제물로 변환 할 수 있습니다. 이제 반복 실험이 수행되었으며 데이터 분석을 사용하여 반복 추세를 추정 할 수 있습니다.

다음과 같이 다소 노이즈가 있고 매우 긴 시계열을 생성한다고 가정하십시오.

x <- seq(1, 100, by=0.01)
y <- sin(x) + rnorm(length(x), 0, 10)
xp <- x %% (2*pi)
s <- myspline(xp, degree=2, knots=pi)
lm(y ~ s)

결과 출력은 합리적인 성능을 보여줍니다.

> summary(fit)

Call:
lm(formula = y ~ s)

Residuals:
    Min      1Q  Median      3Q     Max 
-39.585  -6.736   0.013   6.750  37.389 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.48266    0.38155  -1.265 0.205894    
sspline1.1   1.52798    0.42237   3.618 0.000299 ***
sspline2.1  -0.44380    0.09725  -4.564 5.09e-06 ***
sspline2.2   0.76553    0.18198   4.207 2.61e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9.949 on 9897 degrees of freedom
Multiple R-squared:  0.006406,  Adjusted R-squared:  0.006105 
F-statistic: 21.27 on 3 and 9897 DF,  p-value: 9.959e-14
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.