多项式回归中如何处理不可逆矩阵

How to deal with non-invertible matrix in multi-polynomial regression

我在 R 中使用矩阵乘法进行横截面回归时偶然发现了一个问题。 R 的新手,统计经验有限,自己无法解决这个问题 - 非常感谢收到的任何帮助。

我有一个基于回归的优化循环,它将 time=t 时的值与 time=t+1 时的 "payoffs" 值进行比较。等待的收益根据潜在风险因素(价格)进行回归。潜在的风险因素被模拟 P 次,遵循带有漂移的几何布朗运动。该循环以前在少量模拟下工作,但增加它会产生错误消息: "system is computationally singular reciprocal condition number = ..."表示"solve(t(xRegr) %*% xRegr)"中的不可逆矩阵。

现在,减少多项式的数量会低估该值。有什么方法可以抑制错误消息,或者转换 "solve(t(xRegr) %*% xRegr)" 以便它可以反转?

下面是相关代码,其中Price是风险因素,SimFieldValue是回报。

N = 28
T = 28

optlf=5
dt = T/N
P = 10
r = 0.026


Price= rbind(c(41.6,30.9373763595795,50.8510755776967,67.0854095101179,104.179712954895,91.9561846851854),c(41.6,41.7805145277441,45.2969419055361,56.8008034882723,51.2975554233908,43.8111278805107),c(41.6,28.6279098233156,21.3314087035651,20.574518023275,22.2881983556454,27.0795174265799),c(41.6,70.5277614528247,29.1015319937777,13.0548128902815,12.0061278675634,13.847436849188),c(41.6,44.1031493984421,62.8018585243363,74.1503383978682,41.7441715366698,30.3354484800975),c(41.6,28.7893359367633,26.5639692478215,24.4090558179295,19.6337360761389,14.1689925853019),c(41.6,46.7635567574003,43.6112796397418,38.6191344888522,31.303262237689,33.6213863068342),c(41.6,51.3241496798316,68.3366920314959,37.1573417730625,34.102770690666,42.5484782093497),c(41.6,48.3213777179797,61.4781361505889,48.305834062977,68.1538975243411,61.3328587905223),c(41.6,34.8498282688372,40.753543970661,44.6464110373176,55.5927281643198,72.3179127989415))

SimFieldValue <- rbind(c(0,7128335407.56911,7971821838.52472,8651587961.46277,9007256894.82834,9243136993.46264),c(0,854925728.666238,765018125.378897,550667918.037393,259936653.210146,34756846.7971566),c(0,959505369.703509,1189078149.23609,1510702833.82795,1884481820.25987,2253366922.69965),c(0,-1211900723.14149,-1661769489.59836,-1738754072.40814,-1700303902.88583,-1664246782.18987),c(0,855261002.188481,613809686.798442,107392612.580372,-287402679.541545,-406021110.338772),c(0,123468162.851218,184982670.482902,295982085.76078,505275648.315089,855993510.29109),c(0,-455700534.268202,-743722080.996123,-1008645051.81559,-1213852777.3304,-1413018260.61605),c(0,611685292.905561,238454364.070996,-56860035.8420804,-140901579.660916,-283896785.837518),c(0,2237606831.14696,2173010190.17327,2110165358.78933,1967236308.80406,1718366148.13988),c(0,4974291313.63364,5602914436.65997,6219918555.93423,6804461763.11748,7274812957.2393))


V = matrix(nrow=P,ncol=optlf)
V[,ncol(V)] = pmax(SimFieldValue[,optlf+1],0) 
V[is.na(V)] <- 0
for (t in (optlf-1):1){
  ITM = which(SimFieldValue[,t+1]>0)
  x = Price[ITM,t+1]
  y = V[ITM,t+1]*exp(-r*dt)
  xRegr = cbind(rep(1,length(ITM)),x,x^2,x^3,x^4) #Gjør om senere.
  alpha = solve(t(xRegr) %*% xRegr) %*% (t(xRegr) %*% y)
  CV = xRegr%*%alpha

  ExV = SimFieldValue[ITM,t+1]
  OMG[as.logical(max.col(cbind(CV,ExV))-1),t] = 1


  V[ITM[as.logical(max.col(cbind(CV,ExV))-1)],t] = SimFieldValue[ITM[as.logical(max.col(cbind(CV,ExV))-1)],t+1]
  V[ITM[!as.logical(max.col(cbind(CV,ExV))-1)],t] = V[ITM[!as.logical(max.col(cbind(CV,ExV))-1)],t+1]*(-r)
  ifelse(V[,t]==0,V[,t+1],V[,t])*(-r)

}

我会补充所要求的任何信息。

提前致谢!

设法通过使用 splinefun() 而不是 OLS 来绕过这个问题。

感谢您的评论,@koundy