2016-05-12 90 views
2

我已经偶然发现R中使用矩阵乘法的横截面回归问题。 R新手,在统计方面的经验有限,自己无法解决这个问题 - 非常感谢所收到的任何帮助。如何处理多元多项式回归中的不可逆矩阵

我有一个基于回归的优化循环,比较时间= t时的值到时间= t + 1时的“支付”。等待的收益在潜在的风险因素(价格)上得到回归。潜在的风险因素模拟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) 

} 

我会补充所需的任何信息。

预先感谢您!

+0

我以前只是删除一行(样本)发生这种情况。 – Koundy

+0

@koundy,删除了SimFieldValue和simPaths的第一行 - 仍然是相同的错误消息。你的意思是别的吗? –

回答

1

设法绕过使用splinefun()而不是OLS的问题。

感谢评论,@koundy