Path: blob/master/src/residualcokurtosisSF.c
1433 views
#include <R.h>1#include <Rinternals.h>23SEXP residualcokurtosisSF(SEXP NN, SEXP sstockM2, SEXP sstockM4, SEXP mfactorM2, SEXP bbeta){45/*6arguments7NN : integer, number of assets8sstockM2 : vector of length NN, 2nd moment of the model residuals9sstockM4 : vector of length NN, 4th moment of the model residuals10mfactorM2 : double, 2nd moment of the model factors11bbeta : vector of length NN, factor loadings of model1213Note that this function was orignally written in C++ (using Rcpp) by14Joshua Ulrich and re-written using the C API by Ross Bennett15*/1617// declare pointers for the vectors18double *stockM2, *stockM4, *beta;1920// Do I need to protect these if they are function arguments?21// use REAL() to access the C array inside the numeric vector passed in from R22stockM2 = REAL(sstockM2);23stockM4 = REAL(sstockM4);24beta = REAL(bbeta);2526// Coerce length one R vectors into C scalars27double factorM2 = asReal(mfactorM2);28int N = asInteger(NN);293031// Allocate and initialize matrix values to 032// Do I need to fill the matrix with zeros here?33SEXP M4SF = PROTECT(allocMatrix(REALSXP, N, N*N*N));34double *rM4SF = REAL(M4SF);35// Note that the matrix is stored in column-major order and is represented36// as a 1-dimensional array. Access the element in X(row, col) with:37// element = row + column * nrows38// outer loop over the columns and inner loop down the row39for (int jj = 0; jj < N*N*N; jj++) {40for (int ii = 0; ii < N; ii++) {41rM4SF[ii + jj * N] = 0.0;42}43}4445// Rcpp declarations46// NumericVector stockM2(sstockM2);47// NumericVector stockM4(sstockM4);48// double factorM2 = as<double>(mfactorM2);49// NumericVector beta(bbeta);50// int N = beta.size();51// NumericMatrix M4SF(N, pow(N,3));5253double kijkl=0;5455for(int i=0; i<N; i++) {56for(int j=0; j<N; j++) {57for(int k=0; k<N; k++) {58for(int l=0; l<N; l++) {59// in the general case: i, j , k and l are all different60kijkl = 0;61// if at least one of them are equal:62if( (i==j) || (i==k) || (i==l) || (j==k) || (j==l) || (k==l) ) {63if( (i==j) && (i==k) && (i==l) ) {64// These are the kurtosis estimates of the individual assets: E[u^4]65// kijkl = 6*R_pow_di(beta[i],2)*factorM2*stockM2[i]+stockM4[i];66kijkl = 6*beta[i]*beta[i]*factorM2*stockM2[i]+stockM4[i];67} else {68if( ((i==j) && (i==k)) || ((i==j) && (i==l)) || ((i==k) && (i==l)) || ((j==k) && (j==l)) ) {69// kiij E[ U[,i]^3*U[,j] ] = r3*sqrt( vm6[i]*vm2[j] )70if( (i==j) && (i==k) ) {71kijkl = 3*beta[i]*beta[l]*factorM2*stockM2[i];72} else73if( (i==j) && (i==l) ) {74kijkl = 3*beta[i]*beta[k]*factorM2*stockM2[i];75} else76if( (i==k) && (i==l) ) {77kijkl = 3*beta[i]*beta[j]*factorM2*stockM2[i];78} else79if( (j==k) && (j==l) ) {80kijkl = 3*beta[j]*beta[i]*factorM2*stockM2[j];81}82} else {83if( ((i==j) && (k==l)) || ((i==k) && (j==l)) || ((i==l) && (j==k)) ) {84// kiijj = E[ U[,i]^2*U[,j]^2 ] = r5*sqrt( vm4[i]*vm4[j] )85if( (i==j) && (k==l) ) {86//kijkl = R_pow_di(beta[i],2)*factorM2*stockM2[k] + R_pow_di(beta[k],2)*factorM2*stockM2[i]+stockM2[i]*stockM2[k];87kijkl = beta[i]*beta[i]*factorM2*stockM2[k] + beta[k]*beta[k]*factorM2*stockM2[i]+stockM2[i]*stockM2[k];88} else89if( (i==k) && (j==l) ) {90//kijkl = R_pow_di(beta[i],2)*factorM2*stockM2[j] + R_pow_di(beta[j],2)*factorM2*stockM2[i]+stockM2[i]*stockM2[j];91kijkl = beta[i]*beta[i]*factorM2*stockM2[j] + beta[j]*beta[j]*factorM2*stockM2[i]+stockM2[i]*stockM2[j];92} else93if( (i==l) && (j==k) ) {94//kijkl = R_pow_di(beta[i],2)*factorM2*stockM2[j] + R_pow_di(beta[j],2)*factorM2*stockM2[i]+stockM2[i]*stockM2[j];95kijkl = beta[i]*beta[i]*factorM2*stockM2[j] + beta[j]*beta[j]*factorM2*stockM2[i]+stockM2[i]*stockM2[j];96}97} else {98// kiijk = E[ U[,i]^2*U[,j]*U[,k] ] = r6*sqrt( vm4[i]*r5*sqrt( vm4[j]*vm4[k] ) )99if( i==j ) {100kijkl = beta[k]*beta[l]*factorM2*stockM2[i];101} else102if( i==k ) {103kijkl = beta[j]*beta[l]*factorM2*stockM2[i];104} else105if( i==l ) {106kijkl = beta[j]*beta[k]*factorM2*stockM2[i];107} else108if( j==k ) {109kijkl = beta[i]*beta[l]*factorM2*stockM2[j];110} else111if( j==l ) {112kijkl = beta[i]*beta[k]*factorM2*stockM2[j];113} else114if( k==l ) {115kijkl = beta[i]*beta[j]*factorM2*stockM2[k];116}117}118}119} // no kurtosis estimates of individual assets120} // at least one of them are not equal121// i denotes the subcomoment matrix122// M4SF(k,i*pow(N,2)+j*N+l) = kijkl;123// element = row + column * nrows124rM4SF[k + (i * N * N + j * N + l) * N] = kijkl;125} // loop l126} // loop k127} // loop j128} // loop i129UNPROTECT(1);130return M4SF;131}132133134