З статистичної точки зору: перетворення Фур'є проти регресії на основі Фур'є


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

Вони такі самі. Ось як ...

Робити регресію

Скажімо, що ви підходите до моделі де і . Це не підходить для лінійної регресії, тому замість цього ви використовуєте деяку тригонометрію ( ) і підходимо еквівалентна модель: Запуск лінійної регресії на всіх частотах Фур'є дає вам купу ( ) бета: , . Для будь-якогоt = 1 , ... , N n = пол ( N / 2 ) cos ( a + b ) = cos ( a ) cos ( b ) - гріх ( а ) гріх

yt=j=1nAjcos(2πt[j/N]+ϕj)
t=1,,Nn=floor(N/2)y t = n j = 1 β 1 , j cos ( 2 π t [ j / N ] ) + β 2 , j sin ( 2 π t [ j / N ] ) . { J / N : J = 1 , ... , п } 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}2ni=1,2j{β^i,j}i=1,2j, якщо ви хочете обчислити пару вручну, ви можете використовувати:

β 2,J=Σ N т = 1 утгріх(2πт[J/N])

β^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))]

Зв'язок між двома

Виявляється, зв'язок між регресією та двома періодограмами є:

j

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()дивно масштабує основу.
Тейлор

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)

введіть тут опис зображення

Зауважимо, що частоти є саме правильними, але амплітуди ненульових компонентів немає (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")

введіть тут опис зображення

Гаразд: частоти є правильними, але зауважте, що тепер базові функції вже не є синусами та косинусами (вони є складними експоненціалами , де з я позначаю уявну одиницю). Зауважимо також, що замість набору ненульових частот (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, дані dailyпоставляються з fdaпакетом.
qoheleth

@qoheleth я не знав. Цього вечора я модифікую свою відповідь, використовуючи ваш набір даних, і уточню пару пунктів.
DeltaIV
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.