## Numerical Partial Derivative Estimation – the {NNS} package

`NNS (v0.5.5)` now on CRAN has an updated partial derivative routine `dy.d_()` . This function estimates true average partial derivatives, as well as ceteris paribus conditions for points of interest.

Example below on the syntax for estimating first derivatives of the function `y = x_1^2 * x_2^2` , for the points `x_1 = 0.5` and `x_2 = 0.5`, and for both regressors `x_1` and `x_2`.

`set.seed(123)`
`x_1 = runif(1000)`
`x_2 = runif(1000)`
```y = x_1 ^ 2 * x_2 ^ 2 dy.d_(cbind(x_1, x_2), y, wrt = 1:2, eval.points = t(c(.5,.5)))["First",] [[1]] [1] 0.2454744 [[2]] [1] 0.2439307```

The analytical solution for both regressors at `x_1 = x_2 = 0.5` is 0.25.

The referenced paper gives many more examples, comparing `dy.d_()` to kernel regression gradients and OLS coefficients.

For even more `NNS` capabilities, check out the examples at GitHub:
https://github.com/OVVO-Financial/NNS/blob/NNS-Beta-Version/examples/index.md

Reference Paper:
Vinod, Hrishikesh D. and Viole, Fred, Comparing Old and New Partial Derivative Estimates from Nonlinear Nonparametric Regressions
https://ssrn.com/abstract=3681104

Supplemental Materials:
https://ssrn.com/abstract=3681436

## Introduction to mebootSpear() Function

In the latest version of `meboot (v 1.4-8)` on CRAN, the function `mebootSpear` was introduced.  Below is a gentle introduction to its capabilities and a link to a reference paper with further applications to improved Monte Carlo simulations.

The desired properties from the original maximum entropy bootstrap function `meboot` were retained, while incorporating the additional argument `setSpearman`.  The original function created bootstrap replicates with unit rank-correlations to the original time-series, `setSpearman` relaxes this condition.

AirPassengers
The following example will demonstrate the `mebootSpear` rank-correlation results from the average of 1,000 bootstrap replicates of the `AirPassengers` dataset.

```library(meboot) output <- mebootSpear(AirPassengers, setSpearman = 0, xmin = 0)\$rowAvg```
```cor(output, AirPassengers, method = "spearman") [1] 0.01695065```

Reference
The following paper is available with additional examples and R-code:

Vinod, Hrishikesh D. and Viole, Fred, Arbitrary Spearman’s Rank Correlations in Maximum Entropy Bootstrap and Improved Monte Carlo Simulations (June 7, 2020). Available at SSRN:
https://ssrn.com/abstract=3621614

## Partial Moments Equivalences

Below are some basic equivalences demonstrating partial moments’ role as the elements of variance.

### Why is this relevant?

The additional information generated from partial moments permits a level of analysis simply not possible with traditional summary statistics. There is further introductory material on partial moments and their extension into nonlinear analysis & behavioral finance applications available at:

## Installation

`require(devtools); install_github('OVVO-Financial/NNS',ref = "NNS-Beta-Version")`

### Mean

A difference between the upside area and the downside area of f(x).
```set.seed(123); x=rnorm(100); y=rnorm(100)

> mean(x)
[1] 0.09040591

> UPM(1,0,x)-LPM(1,0,x)
[1] 0.09040591```

### Variance

A sum of the squared upside area and the squared downside area.
```> var(x)
[1] 0.8332328

# Sample Variance:
> UPM(2,mean(x),x)+LPM(2,mean(x),x)
[1] 0.8249005

# Population Variance:
> (UPM(2,mean(x),x)+LPM(2,mean(x),x))*(length(x)/(length(x)-1))
[1] 0.8332328

# Variance is also the co-variance of itself:
> (Co.LPM(1,1,x,x,mean(x),mean(x))+Co.UPM(1,1,x,x,mean(x),mean(x))-D.LPM(1,1,x,x,mean(x),mean(x))-D.UPM(1,1,x,x,mean(x),mean(x)))*(length(x)/(length(x)-1))
[1] 0.8332328```

### Standard Deviation

```> sd(x)
[1] 0.9128159

> ((UPM(2,mean(x),x)+LPM(2,mean(x),x))*(length(x)/(length(x)-1)))^.5
[1] 0.9128159```

### Covariance

```> cov(x,y)
[1] -0.04372107

> (Co.LPM(1,1,x,y,mean(x),mean(y))+Co.UPM(1,1,x,y,mean(x),mean(y))-D.LPM(1,1,x,y,mean(x),mean(y))-D.UPM(1,1,x,y,mean(x),mean(y)))*(length(x)/(length(x)-1))
[1] -0.04372107```

### Covariance Elements and Covariance Matrix

```> cov(cbind(x,y))
x           y
x  0.83323283 -0.04372107
y -0.04372107  0.93506310

> cov.mtx=PM.matrix(LPM.degree = 1,UPM.degree = 1,target = 'mean', variable = cbind(x,y), pop.adj = TRUE)

> cov.mtx
\$clpm
x         y
x 0.4033078 0.1559295
y 0.1559295 0.3939005

\$cupm
x         y
x 0.4299250 0.1033601
y 0.1033601 0.5411626

\$dlpm
x         y
x 0.0000000 0.1469182
y 0.1560924 0.0000000

\$dupm
x         y
x 0.0000000 0.1560924
y 0.1469182 0.0000000

\$matrix
x           y
x  0.83323283 -0.04372107
y -0.04372107  0.93506310```

### Pearson Correlation

```> cor(x,y)
[1] -0.04953215

> cov.xy=(Co.LPM(1,1,x,y,mean(x),mean(y))+Co.UPM(1,1,x,y,mean(x),mean(y))-D.LPM(1,1,x,y,mean(x),mean(y))-D.UPM(1,1,x,y,mean(x),mean(y)))*(length(x)/(length(x)-1))

> sd.x=((UPM(2,mean(x),x)+LPM(2,mean(x),x))*(length(x)/(length(x)-1)))^.5

> sd.y=((UPM(2,mean(y),y)+LPM(2,mean(y),y))*(length(y)/(length(y)-1)))^.5

> cov.xy/(sd.x*sd.y)
[1] -0.04953215```

### Skewness*

A normalized difference between upside area and downside area.
```> skewness(x)
[1] 0.06049948

> ((UPM(3,mean(x),x)-LPM(3,mean(x),x))/(UPM(2,mean(x),x)+LPM(2,mean(x),x))^(3/2))
[1] 0.06049948```

### UPM/LPM – a more intuitive measure of skewness. (Upside area / Downside area)

```> UPM(1,0,x)/LPM(1,0,x)
[1] 1.282673```

### Kurtosis*

A normalized sum of upside area and downside area.
```> kurtosis(x)
[1] -0.161053

> ((UPM(4,mean(x),x)+LPM(4,mean(x),x))/(UPM(2,mean(x),x)+LPM(2,mean(x),x))^2)-3
[1] -0.161053```

### CDFs

```> P=ecdf(x)

> P(0);P(1)
[1] 0.48
[1] 0.83

> LPM(0,0,x);LPM(0,1,x)
[1] 0.48
[1] 0.83

# Vectorized targets:
> LPM(0,c(0,1),x)
[1] 0.48 0.83

# Joint CDF:
> Co.LPM(0,0,x,y,0,0)
[1] 0.28

# Vectorized targets:
> Co.LPM(0,0,x,y,c(0,1),c(0,1))
[1] 0.28 0.73```

### PDFs

```> tgt=sort(x)

# Arbitrary d/dx approximation
> d.dx=(max(x)+abs(min(x)))/100

> PDF=(LPM.ratio(1,tgt+d.dx,x)-LPM.ratio(1,tgt-d.dx,x))

> plot(sort(x),PDF,col='blue',type='l',lwd=3,xlab="x")```

### Numerical Integration – [UPM(1,0,f(x))-LPM(1,0,f(x))]=[F(b)-F(a)]/[b-a]

```# x is uniform sample over interval [a,b]; y = f(x)
> x=seq(0,1,.001);y=x^2

> UPM(1,0,y)-LPM(1,0,y)
[1] 0.3335```

### Bayes’ Theorem

https://github.com/OVVO-Financial/NNS/blob/NNS-Beta-Version/examples/Bayes’%20Theorem%20From%20Partial%20Moments.pdf

*Functions are called from the PerformanceAnalytics package

`require(PerformanceAnalytics)`