Как бороться с необратимой матрицей в полиномиальной регрессии

Я наткнулся на проблему сечения регрессии в R с использованием умножения матриц. Новичок в R, с ограниченным опытом в области статистики, не смог решить это сам - так благодарен за любую помощь, полученную.

У меня есть цикл оптимизации на основе регрессии, который сравнивает значения во время =t с "выплатами" во время =t+1. Окупаемость ожидания регрессирует на основной фактор риска (цена). Основной фактор риска моделируется P раз, после геометрического броуновского движения с дрейфом. Цикл ранее работал с небольшим количеством симуляций, но увеличение его привело к появлению сообщения об ошибке: "система является числовым взаимно единичным условным числом = ...", указывающим на необратимую матрицу в "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)

}

Я буду дополнять любую запрашиваемую информацию.

Заранее спасибо!

1 ответ

Решение

Удалось обойти проблему, используя splinefun() вместо OLS.

Спасибо за комментарий, @koundy

Другие вопросы по тегам