如何在R中运行复数值回归以实现频域去趋势?
复数值回归的解决方法
R原生的lm()函数不支持复数值的模型矩阵,这就是你报错的核心原因——它会强制将复数转成实数(直接丢弃虚部),进而触发模型矩阵不支持复数的错误。要在R中运行复数值回归,你可以手动利用复线性回归的解析公式计算系数,无需依赖lm()。
复线性回归的核心公式
对于复线性模型 ( y = X\beta + \epsilon ),系数的最小二乘解为:
[
\beta = (X^H X)^{-1} X^H y
]
其中 ( X^H ) 表示矩阵 ( X ) 的共轭转置。
针对你代码的修改方案
结合你频域去趋势的需求,修改后的完整代码如下:
library(quantmod) getSymbols.FRED("GDPC1", env = .GlobalEnv) # 数据预处理:转换时间索引并提取数值(矩阵运算仅需数值,无需保留ts属性) index(GDPC1) = as.yearqtr(index(GDPC1)) GDPC2 = as.numeric(GDPC1) time.trend = 1:310/310 N = 310 # 构建归一化DFT矩阵 mytheta = exp(-2i*pi/N) W = outer(0:(N-1), 0:(N-1), function(i, j) mytheta^(i*j)) / sqrt(N) # 计算频域下的响应变量和自变量 y_fft = W %*% GDPC2 X_fft = W %*% time.trend # 计算复回归系数 X_H = Conj(t(X_fft)) # 计算矩阵的共轭转置 beta = solve(X_H %*% X_fft) %*% X_H %*% y_fft # 频域去趋势:得到去趋势后的频域数据 y_fft_detrended = y_fft - X_fft %*% beta # 逆傅里叶变换回时域(W是归一化DFT矩阵,逆变换用自身的共轭转置) GDPC_detrended = Conj(t(W)) %*% y_fft_detrended # 提取实部(原始数据为实数,去趋势后虚部接近0,可忽略) GDPC_detrended = Re(GDPC_detrended)
关键说明
- 弃用
lm()的原因:lm()的底层模型矩阵仅支持实数类型,无法处理复数,强制转换会丢失虚部信息,导致结果完全偏离预期。 - 共轭转置的实现:R中通过
Conj(t(mat))可以快速得到矩阵的共轭转置,这是复回归计算的核心步骤。 - 逆傅里叶变换:你构建的
W是归一化的DFT矩阵,其逆变换矩阵就是自身的共轭转置,因此用Conj(t(W))即可完成逆变换,最后提取实部得到时域的去趋势数据。
内容的提问来源于stack exchange,提问作者user2338823
相关产品推荐
相关产品推荐

