통계적 관점에서 : 푸리에 기준으로 푸리에 변환 대 회귀


13

이산 푸리에 변환이 푸리에 기준을 사용하여 회귀와 동일한 곡선 표현을 제공하는지 이해하려고합니다. 예를 들어

library(fda)
Y=daily$tempav[,1] ## my data
length(Y) ## =365

## create Fourier basis and estimate the coefficients
mybasis=create.fourier.basis(c(0,365),365)  
basisMat=eval.basis(1:365,mybasis)
regcoef=coef(lm(Y~basisMat-1))

## using Fourier transform
fftcoef=fft(Y)

## compare
head(fftcoef)
head(regcoef)

FFT는 복소수를 제공하지만 회귀는 실수를 제공합니다.

그들은 같은 정보를 전달합니까? 두 숫자 집합 사이에 일대일 맵이 있습니까?

(엔지니어의 관점이 아닌 통계학 자의 관점에서 답을 쓰면 감사하겠습니다. 많은 온라인 자료에는 엔지니어링 전문 용어가 있습니다.


코드 스 니펫에 익숙하지 않으므로 다음 문제가 적용되는지 말할 수 없습니다. 그러나, 일반적으로 DFT 기준은 적분 ( "전체 수") 주파수로 정의되는 반면, 회귀에 대한 일반적인 "푸리에 기준"은 임의의 주파수 비율 (예를 들어, 적어도 연속 산술에서는 비이성적 포함)을 사용할 수 있습니다. 이것 또한 흥미로울 수 있습니다.
GeoMatt22

코드 스 니펫과 달리 수학 용어로 질문을 작성하면 모든 사람이 도움이 될 것이라고 생각합니다. 회귀 문제는 무엇입니까? 사용하는 푸리에 기본 기능은 무엇입니까? 당신은 당신의 질문에 대한 답변이 어떻게 향상 될지에 놀랄 것입니다.
Yair Daon

답변:


15

그들은 동일합니다. 방법은 다음과 같습니다.

회귀 분석

모델에 적합하다고 가정합니다. 여기서 및 . 이것은 선형 회귀에 적합하지 않으므로 대신 삼각법 ( )을 사용하십시오. 동등한 모델 : 모든 푸리에 주파수에서 선형 회귀를 실행하면 은 베타 ( )의 베타를 제공합니다 : , 입니다. 어떤

yt=j=1nAjcos(2πt[j/N]+ϕj)
t=1,,Nn=floor(N/2)cos(a+b)=cos(a)cos(b)sin(a)sin(b)
yt=j=1nβ1,jcos(2πt[j/N])+β2,jsin(2πt[j/N]).
{j/N:j=1,,n}2n{β^i,j}i=1,2j, 직접 쌍을 계산하려면 다음을 사용할 수 있습니다.

β^1,j=t=1Nytcos(2πt[j/N])t=1Ncos2(2πt[j/N])
및 이것들은 표준 회귀 공식입니다.
β^2,j=t=1Nytsin(2πt[j/N])t=1Nsin2(2πt[j/N]).

이산 푸리에 변환하기

푸리에 변환을 실행하면 대해 계산됩니다 .j=1,,n

d(j/N)=N1/2t=1Nytexp[2πit[j/N]]=N1/2(t=1Nytcos(2πt[j/N])it=1Nytsin(2πt[j/N])).

이것은 복소수입니다 (공지 사항 ). 평등이 유지되는 이유를 보려면 , 및 .ieix=cos(x)+isin(x)cos(x)=cos(x)sin(x)=sin(x)

각 에 대해 복소 공액의 제곱을 취하면 " 주기도 "가 표시됩니다.j

|d(j/N)|2=N1(t=1Nytcos(2πt[j/N]))2+N1(t=1Nytsin(2πt[j/N]))2.
R 에서이 벡터를 계산 I <- abs(fft(Y))^2/length(Y)하는 것은 스케일링해야하기 때문에 이상합니다.

또한 " 스케일링 된 주기도 "를 정의 할 수 있습니다. 분명히 . R에서는 이것이 될 것 입니다.

P(j/N)=(2Nt=1Nytcos(2πt[j/N]))2+(2Nt=1Nytsin(2πt[j/N]))2.
P(j/N)=4N|d(j/N)|2P <- (4/length(Y))*I[(1:floor(length(Y)/2))]

둘 사이의 연결

회귀와 두 주기도 사이의 연결은 다음과 같습니다.

P(j/N)=β^1,j2+β^2,j2.
왜? 선택한 기준이 직교 / 직교 정규이기 때문입니다. 각 대해 입니다. 회귀 계수와 짜잔을 위해 공식의 분모에 연결하십시오.jt=1Ncos2(2πt[j/N])=t=1Nsin2(2πt[j/N])=N/2

출처 : https://www.amazon.com/Time-Analysis-Its-Applications-Statistics/dp/144197864X


1
답변과 출처는 +1입니다. R내가 게시 한 개체로 결과를 보여줄 수 있다면 좋을 것 입니다.
qoheleth

@qoheleth 나는 당신에게 그것을 떠날 것이다. fft()내가 쓴 방법 (이미 언급 했음)이 어떻게 가로 채지 않는지, 요격으로 아무 것도 증명하지 않았으며 create.fourier.basis(), 기저 함수를 이상하게 스케일링하는 것에 지치십시오.
Taylor

6

그들은 강하게 관련되어 있습니다. 데이터를 포함하지 않았기 때문에 예제를 재현 할 수 없으므로 새로 작성하겠습니다. 우선, 주기적 함수를 만들어 봅시다 :

T <- 10
omega <- 2*pi/T
N <- 21
x <- seq(0, T, len = N)
sum_sines_cosines <- function(x, omega){
    sin(omega*x)+2*cos(2*omega*x)+3*sin(4*omega*x)+4*cos(4*omega*x)
}
Yper <- sum_sines_cosines(x, omega)
Yper[N]-Yper[1] # numerically 0

x2 <- seq(0, T, len = 1000)
Yper2 <- sum_sines_cosines(x2, omega)
plot(x2, Yper2, col = "red", type = "l", xlab = "x", ylab = "Y")
points(x, Yper)

여기에 이미지 설명을 입력하십시오

이제 회귀에 대한 푸리에 기초를 만들어 봅시다. 그 양해와 , 정말 의미보다 더 만들 수없는 , 기저 함수, 즉 일정하지 않은 사인 및 코사인 때문에 높은 주파수 성분 이러한 그리드에서 별칭이 지정됩니다. 예를 들어, 주파수 의 사인은 원가 (사인)와 구별 할 수 없습니다. 의 경우 , 즉 . 당신이 한 번 확인하고 싶은 경우 어쨌든, 단지 변경 에 마지막 두 열에서 아래의 미리보기 및보기에 : 당신이 실제로 쓸모없는 것을 볼 수 있습니다 (그리고 디자인 매트릭스는 이제 단수이기 때문에 그들이 적합성에 대한 문제를 만들 ).N=2k+1N2N3=2(k1)kωN=3k=1N-2N

# Fourier Regression with fda
library(fda)
mybasis <- create.fourier.basis(c(0,T),N-2)
basisMat <- eval.basis(x, mybasis)
FDA_regression <- lm(Yper ~ basisMat-1)
FDA_coef <-coef(FDA_regression)
barplot(FDA_coef)

여기에 이미지 설명을 입력하십시오

주파수는 정확히 올바른 주파수이지만 0이 아닌 성분의 진폭은 (1,2,3,4)가 아닙니다. 그 이유는 fda푸리에 기준 함수가 이상한 방식으로 확장되기 때문입니다. 일반적인 푸리에 기준 같이 최대 값은 1이 아닙니다 . 그것은 아니다 중 하나, 그것은 직교 푸리에 기준에 대한했을로, .1,sinωx,cosωx,1π12π,sinωxπ,cosωxπ,

# FDA basis has a weird scaling
max(abs(basisMat))
plot(mybasis)

여기에 이미지 설명을 입력하십시오

당신은 분명히 그것을 본다 :

  1. 최대 값은 보다 작습니다.1π
  2. 푸리에 기준 (첫 번째 항으로 잘림 )에는 상수 함수 (검은 색 선), 증가하는 주파수의 사인 (도메인 경계에서 0과 같은 곡선) 및 증가하는 주파수의 코사인 ( 도메인 경계에서 1과 같음)N2

에 의해 주어진 푸리에 기준을 간단히 스케일링하여 fda일반적인 푸리에 기준이 얻어 지면서 기대 값을 갖는 회귀 계수가됩니다.

basisMat <- basisMat/max(abs(basisMat))
FDA_regression <- lm(Yper ~ basisMat-1)
FDA_coef <-coef(FDA_regression)
barplot(FDA_coef, names.arg = colnames(basisMat), main = "rescaled FDA coefficients")

여기에 이미지 설명을 입력하십시오

fft지금 시도해 봅시다 : Yper주기적인 순서이므로 마지막 점은 실제로 어떤 정보도 추가하지 않습니다 (시퀀스의 DFT는 항상 주기적입니다). 따라서 FFT를 계산할 때 마지막 지점을 버릴 수 있습니다. 또한 FFT는 DFT를 계산하는 빠른 수치 알고리즘 이며 실수 또는 복소수 시퀀스의 DFT는 복소수 입니다. 따라서 우리는 FFT 계수의 계수를 정말로 원합니다.

# FFT
fft_coef <- Mod(fft(Yper[1:(N-1)]))*2/(N-1)

푸리에 기준 와 동일한 스케일링을 갖기 위해 을 곱 합니다 . 스케일링하지 않았다면 여전히 올바른 주파수를 복구하지만 진폭은 이전에 찾은 것과 동일한 요인으로 스케일링됩니다. 이제 fft 계수를 플로팅 해 봅시다 :2N11,sinωx,cosωx,

fft_coef <- fft_coef[1:((N-1)/2)]
terms <- paste0("exp",seq(0,(N-1)/2-1))
barplot(fft_coef, names.arg = terms, main = "FFT coefficients")

여기에 이미지 설명을 입력하십시오

Ok : 빈도는 정확하지만 이제 기본 함수는 더 이상 죄와 코사인이 아닙니다 (복잡한 지수 이며 여기서 는 허수 단위를 나타냅니다). 또한 이전과 같이 0이 아닌 주파수 세트 (1,2,3,4) 대신 세트 (1,2,5)를 얻었습니다. 그 이유는 이 복소수 확장에서 라는 용어 ( 은 복소수)가 두 개의 실수 인 에 해당하기 때문입니다. 오일러 공식 인해 삼각법 기반 확장 입니다. 복소수 계수는 두 개의 실제 계수의 구 적합의 합계와 같습니다. 즉,expniωxixnexpniωxxnansin(nωx)+bncos(nωx)expix=cosx+isinx 5=|xn|=an2+bn2 . 실제로 입니다.5=33+42


1
DeltaIV 덕분에 데이터 dailyfda패키지 와 함께 제공 됩니다.
qoheleth

@qoheleth 몰랐어요. 오늘 저녁 귀하의 데이터 세트를 사용하여 답변을 수정하고 몇 가지 사항을 명확히하겠습니다.
DeltaIV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.