# Prereqs (uncomment if needed):
# install.packages("NNS")
# install.packages(c("data.table","xts","zoo","Rfast"))
suppressPackageStartupMessages({
library(NNS)
library(data.table)
})
set.seed(42)
Goal. A complete, hands‑on curriculum for Nonlinear Nonparametric Statistics (NNS) using partial moments. Each section blends narrative intuition, precise math, and executable code.
Structure. 1. Foundations — partial moments & variance decomposition 2. Descriptive & distributional tools 3. Dependence & nonlinear association 4. Hypothesis testing & ANOVA (LPM‑CDF) 5. Regression, boosting, stacking & causality 6. Time series & forecasting 7. Simulation (max‑entropy), Monte Carlo & risk‑neutral rescaling 8. Portfolio & stochastic dominance
Notation. For a random variable \(X\) and threshold/target \(t\), the population \(n\)‑th partial moments are defined as
\[ \operatorname{LPM}(n,t,X) = \int_{-\infty}^{t} (t-x)^{n} \, dF_X(x), \qquad \operatorname{UPM}(n,t,X) = \int_{t}^{\infty} (x-t)^{n} \, dF_X(x). \]
The empirical estimators replace \(F_X\) with the empirical CDF \(\hat F_n\) (or, equivalently, use indicator functions):
\[ \widehat{\operatorname{LPM}}_n(t;X) = \frac{1}{n} \sum_{i=1}^n (t-x_i)^n \, \mathbf{1}_{\{x_i \le t\}}, \qquad \widehat{\operatorname{UPM}}_n(t;X) = \frac{1}{n} \sum_{i=1}^n (x_i-t)^n \, \mathbf{1}_{\{x_i > t\}}. \]
These correspond to integrals over the measurable subsets \(\{X \le t\}\) and \(\{X > t\}\) in a \(\sigma\)‑algebra; the empirical sums are discrete analogues of Lebesgue integrals.
LPM(degree, target, variable)
UPM(degree, target, variable)
LPM.ratio(degree = 0, target, variable)
(empirical CDF
when degree=0
)UPM.ratio(degree = 0, target, variable)
LPM.VaR(p, degree, variable)
(quantiles via
partial‑moment CDFs)# Normal sample
y <- rnorm(3000)
mu <- mean(y)
L2 <- LPM(2, mu, y); U2 <- UPM(2, mu, y)
cat(sprintf("LPM2 + UPM2 = %.6f vs var(y)=%.6f\n", (L2+U2)*(length(y) / (length(y) - 1)), var(y)))
## LPM2 + UPM2 = 1.011889 vs var(y)=1.011889
# Empirical CDF via LPM.ratio(0, t, x)
for (t in c(-1,0,1)) {
cdf_lpm <- LPM.ratio(0, t, y)
cat(sprintf("CDF at t=%+.1f : LPM.ratio=%.4f | empirical=%.4f\n", t, cdf_lpm, mean(y<=t)))
}
## CDF at t=-1.0 : LPM.ratio=0.1633 | empirical=0.1633
## CDF at t=+0.0 : LPM.ratio=0.5043 | empirical=0.5043
## CDF at t=+1.0 : LPM.ratio=0.8480 | empirical=0.8480
# Asymmetry on a skewed distribution
z <- rexp(3000)-1; mu_z <- mean(z)
cat(sprintf("Skewed z: LPM2=%.4f, UPM2=%.4f (expect imbalance)\n", LPM(2,mu_z,z), UPM(2,mu_z,z)))
## Skewed z: LPM2=0.2780, UPM2=0.7682 (expect imbalance)
Interpretation. The equality
LPM2 + UPM2 == var(x)
(Bessel adjustment used) holds
because deviations are measured against the global mean.
LPM.ratio(0, t, x)
constructs an empirical CDF directly
from partial‑moment counts.
Define asymmetric analogues of skewness/kurtosis using \(\operatorname{UPM}_3\), \(\operatorname{LPM}_3\) (and degree 4), yielding robust tail diagnostics without parametric assumptions.
Header. NNS.moments(x)
## $mean
## [1] -0.0114498
##
## $variance
## [1] 1.011552
##
## $skewness
## [1] -0.007412142
##
## $kurtosis
## [1] 0.06723772
Header. NNS.mode(x)
## [1] -2.049405 1.987674
qgrid <- quantile(z, probs = seq(0.05,0.95,by=0.1))
CDF_tbl <- data.table(threshold = as.numeric(qgrid), CDF = sapply(qgrid, function(q) LPM.ratio(0,q,z)))
CDF_tbl
## threshold CDF
## 1: -0.94052127 0.05
## 2: -0.83748109 0.15
## 3: -0.71317882 0.25
## 4: -0.57443327 0.35
## 5: -0.41017671 0.45
## 6: -0.20424962 0.55
## 7: 0.06850182 0.65
## 8: 0.41462712 0.75
## 9: 0.94307172 0.85
## 10: 2.09633977 0.95
Pearson captures linear monotone relationships. Many structures (U‑shapes, saturation, asymmetric tails) produce near‑zero \(r\) despite strong dependence. Partial‑moment dependence metrics respond to such structure.
Headers. - Co.LPM(degree, target, x, y)
/ Co.UPM(...)
(co‑partial moments) -
PM.matrix(l_degree, u_degree, target=NULL, variable, pop_adj=TRUE)
- NNS.dep(x, y)
(scalar dependence coefficient) -
NNS.copula(X, target=NULL, continuous=TRUE, plot=FALSE, independence.overlay=FALSE)
set.seed(1)
x <- runif(2000,-1,1)
y <- x^2 + rnorm(2000, sd=.05)
cat(sprintf("Pearson r = %.4f\n", cor(x,y)))
## Pearson r = 0.0006
## NNS.dep = 0.7097
X <- data.frame(a=x, b=y, c=x*y + rnorm(2000, sd=.05))
pm <- PM.matrix(1, 1, target = "means", variable=X, pop_adj=TRUE)
pm
## $cupm
## a b c
## a 0.17384174 0.05668152 0.10450858
## b 0.05668152 0.05566363 0.04414923
## c 0.10450858 0.04414923 0.07529373
##
## $dupm
## a b c
## a 0.0000000000 0.05675501 0.0005598221
## b 0.0143108307 0.00000000 0.0036839026
## c 0.0004239566 0.04430691 0.0000000000
##
## $dlpm
## a b c
## a 0.0000000000 0.014310831 0.0004239566
## b 0.0567550147 0.000000000 0.0443069142
## c 0.0005598221 0.003683903 0.0000000000
##
## $clpm
## a b c
## a 0.16803827 0.014485430 0.102709867
## b 0.01448543 0.037120650 0.003051617
## c 0.10270987 0.003051617 0.074865823
##
## $cov.matrix
## a b c
## a 0.3418800141 0.0001011068 0.206234664
## b 0.0001011068 0.0927842833 -0.000789973
## c 0.2062346637 -0.0007899730 0.150159552
## [1] 0.5692785
# Data
set.seed(123); x = rnorm(100); y = rnorm(100); z = expand.grid(x, y)
# Plot
rgl::plot3d(z[,1], z[,2], Co.LPM(0, z[,1], z[,2], z[,1], z[,2]), col = "red")
# Uniform values
u_x = LPM.ratio(0, x, x); u_y = LPM.ratio(0, y, y); z = expand.grid(u_x, u_y)
# Plot
rgl::plot3d(z[,1], z[,2], Co.LPM(0, z[,1], z[,2], z[,1], z[,2]), col = "blue")
Interpretation. NNS.dep
remains high
for curved relationships; PM.matrix
collects co‑partial
moments across variables; NNS.copula
summarizes
higher‑dimensional dependence using partial‑moment ratios. Copulas are
returned and evaluated via Co.LPM
functions.
Instead of distributional assumptions, compare groups via LPM‑based CDFs. Output is a degree of certainty (not a p‑value) for equality of populations or means.
Header.
NNS.ANOVA(control, treatment, means.only=FALSE, medians=FALSE, confidence.interval=.95, tails=c("Both","left","right"), pairwise=FALSE, plot=TRUE, robust=FALSE)
ctrl <- rnorm(200, 0, 1)
trt <- rnorm(180, 0.35, 1.2)
NNS.ANOVA(control=ctrl, treatment=trt, means.only=FALSE, plot=FALSE)
## $Control
## [1] -0.02110331
##
## $Treatment
## [1] 0.4020782
##
## $Grand_Statistic
## [1] 0.1904875
##
## $Control_CDF
## [1] 0.6311761
##
## $Treatment_CDF
## [1] 0.3869042
##
## $Certainty
## [1] 0.3904966
##
## $Effect_Size_LB
## 2.5%
## 0.1379073
##
## $Effect_Size_UB
## 97.5%
## 0.7182389
##
## $Confidence_Level
## [1] 0.95
A <- list(g1=rnorm(150,0.0,1.1), g2=rnorm(150,0.2,1.0), g3=rnorm(150,-0.1,0.9))
NNS.ANOVA(control=A, means.only=TRUE, plot=FALSE)
## Certainty
## 0.4870367
Math sketch. For each quantile/threshold \(t\), compare CDFs built from
LPM.ratio(0, t, •)
(possibly with one‑sided tails).
Aggregate across \(t\) to a certainty
score.
NNS.reg
learns partitioned
relationships using partial‑moment weights — linear where appropriate,
nonlinear where needed — avoiding fragile global parametric forms.
Headers. -
NNS.reg(x, y, order=NULL, smooth=TRUE, ncores=1, ...)
→
$Fitted.xy
, $Point.est
, … -
NNS.boost(IVs.train, DV.train, IVs.test, epochs, learner.trials, status, balance, type, folds)
-
NNS.stack(IVs.train, DV.train, IVs.test, type, balance, ncores, folds)
- NNS.caus(x, y)
(directional causality score via
conditional dependence)
# Example 1: Nonlinear regression
set.seed(123)
x_train <- runif(200, -2, 2)
y_train <- sin(pi * x_train) + rnorm(200, sd = 0.2)
x_test <- seq(-2, 2, length.out = 100)
NNS.reg(x = data.frame(x = x_train), y = y_train, order = NULL)
## $R2
## [1] 0.9311519
##
## $SE
## [1] 0.2026925
##
## $Prediction.Accuracy
## NULL
##
## $equation
## NULL
##
## $x.star
## NULL
##
## $derivative
## Coefficient X.Lower.Range X.Upper.Range
## 1: 1.2434405 -1.99750091 -1.73845327
## 2: 1.0742631 -1.73845327 -1.44607946
## 3: -1.7569574 -1.44607946 -1.15089951
## 4: -2.8177481 -1.15089951 -0.92639490
## 5: -2.7344640 -0.92639490 -0.71353077
## 6: -0.9100977 -0.71353077 -0.48670931
## 7: 0.9413676 -0.48670931 -0.26368123
## 8: 3.1046330 -0.26368123 -0.07056066
## 9: 2.3015348 -0.07056066 0.09052852
## 10: 3.1725079 0.09052852 0.25161770
## 11: 1.3891814 0.25161770 0.45309215
## 12: -1.2585111 0.45309215 0.66464355
## 13: -2.5182434 0.66464355 1.01253792
## 14: -2.9012891 1.01253792 1.23520889
## 15: -0.7677850 1.23520889 1.53007549
## 16: 1.8706437 1.53007549 1.63683301
## 17: 2.2033668 1.63683301 1.84911541
## 18: 2.5081594 1.84911541 1.97707911
##
## $Point.est
## NULL
##
## $pred.int
## NULL
##
## $regression.points
## x y
## 1: -1.99750091 0.30256920
## 2: -1.73845327 0.62467954
## 3: -1.44607946 0.93876593
## 4: -1.15089951 0.42014733
## 5: -0.92639490 -0.21245010
## 6: -0.71353077 -0.79451941
## 7: -0.48670931 -1.00094909
## 8: -0.26368123 -0.79099767
## 9: -0.07056066 -0.19142920
## 10: 0.09052852 0.17932316
## 11: 0.25161770 0.69037987
## 12: 0.45309215 0.97026443
## 13: 0.66464355 0.70402465
## 14: 1.01253792 -0.17205805
## 15: 1.23520889 -0.81809091
## 16: 1.53007549 -1.04448505
## 17: 1.63683301 -0.84477976
## 18: 1.84911541 -0.37704378
## 19: 1.97707911 -0.05609043
##
## $Fitted.xy
## x.x y y.hat NNS.ID gradient residuals
## 1: -0.8496899 -0.5969396 -0.4221971 q11222 -2.7344640 0.174742446
## 2: 1.1532205 -0.4116052 -0.5802190 q21222 -2.9012891 -0.168613758
## 3: -0.3640923 -0.9595645 -0.8855214 q12122 0.9413676 0.074043066
## 4: 1.5320696 -1.0644376 -1.0407547 q22122 1.8706437 0.023682815
## 5: 1.7618691 -0.8705785 -0.5692793 q22212 2.2033668 0.301299171
## ---
## 196: -0.1338692 -0.3949338 -0.3879789 q12221 3.1046330 0.006954855
## 197: -0.3726696 -0.5476828 -0.8935958 q12122 0.9413676 -0.345913048
## 198: 0.6369213 0.6387223 0.7389134 q21211 -1.2585111 0.100191135
## 199: -1.3906135 0.9457286 0.8413147 q11122 -1.7569574 -0.104413995
## 200: 0.2914682 1.0429566 0.7457395 q21112 1.3891814 -0.297217109
## standard.errors
## 1: 0.2830616
## 2: 0.1682392
## 3: 0.2096766
## 4: 0.1380874
## 5: 0.2328510
## ---
## 196: 0.1281159
## 197: 0.2096766
## 198: 0.2474949
## 199: 0.2329677
## 200: 0.2435048
# Simple train/test for boosting & stacking
test.set = 141:150
boost <- NNS.boost(IVs.train = iris[-test.set, 1:4],
DV.train = iris[-test.set, 5],
IVs.test = iris[test.set, 1:4],
epochs = 10, learner.trials = 10,
status = FALSE, balance = TRUE,
type = "CLASS", folds = 1)
mean(boost$results == as.numeric(iris[test.set,5]))
[1] 1
boost$feature.weights; boost$feature.frequency
stacked <- NNS.stack(IVs.train = iris[-test.set, 1:4],
DV.train = iris[-test.set, 5],
IVs.test = iris[test.set, 1:4],
type = "CLASS", balance = TRUE,
ncores = 1, folds = 1)
mean(stacked$stack == as.numeric(iris[test.set,5]))
[1] 1
## Causation.x.given.y Causation.y.given.x C(x--->y)
## 0.2607148 0.3863580 0.3933374
## Causation.x.given.y Causation.y.given.x C(y--->x)
## 0.3863580 0.2607148 0.3933374
Interpretation. Examine asymmetry in scores to infer direction. The method conditions partial‑moment dependence on candidate drivers.
Headers. NNS.ARMA
,
NNS.ARMA.optim
, NNS.seas
,
NNS.VAR
# Univariate nonlinear ARMA
z <- as.numeric(scale(sin(1:480/8) + rnorm(480, sd=.35)))
# Seasonality detection (prints a summary)
NNS.seas(z, plot = FALSE)
## $all.periods
## Period Coefficient.of.Variation Variable.Coefficient.of.Variation
## 1: 99 5.122054e-01 7.866136e+16
## 2: 147 5.256021e-01 7.866136e+16
## 3: 100 5.598477e-01 7.866136e+16
## 4: 146 5.618687e-01 7.866136e+16
## 5: 199 5.766158e-01 7.866136e+16
## ---
## 235: 235 2.273832e+02 7.866136e+16
## 236: 30 4.402306e+02 7.866136e+16
## 237: 11 4.879713e+02 7.866136e+16
## 238: 46 5.854636e+02 7.866136e+16
## 239: 1 2.621230e+16 7.866136e+16
##
## $best.period
## Period
## 99
##
## $periods
## [1] 99 147 100 146 199 98 97 200 49 198 48 96 145 196 194 193 195 197
## [19] 144 50 192 149 176 53 191 148 95 156 190 106 150 202 239 52 143 201
## [37] 105 142 189 209 158 238 157 211 160 155 107 212 177 104 210 188 154 208
## [55] 126 163 152 103 207 127 172 117 159 128 206 109 175 224 179 47 170 221
## [73] 227 171 86 85 130 54 222 129 236 178 153 141 237 108 203 181 34 101
## [91] 180 226 161 94 87 213 162 43 115 113 166 102 80 59 204 66 40 135
## [109] 61 217 81 90 131 56 44 223 83 60 132 84 74 93 88 45 229 167
## [127] 173 133 122 116 151 70 174 187 51 112 219 228 121 136 232 120 37 169
## [145] 25 182 22 14 186 82 118 89 184 39 72 67 234 64 18 140 91 216
## [163] 57 124 233 168 32 16 134 73 75 92 139 36 41 220 230 58 123 69
## [181] 38 76 28 164 26 138 225 125 165 185 68 55 65 35 2 183 6 42
## [199] 78 215 137 21 8 20 15 62 7 231 79 13 205 24 17 119 12 31
## [217] 214 63 33 27 111 3 9 19 10 218 114 4 23 5 110 71 77 29
## [235] 235 30 11 46 1
# Validate seasonal periods
NNS.ARMA.optim(z, h=48, seasonal.factor = NNS.seas(z, plot = FALSE)$periods, plot = TRUE, ncores = 1)
## [1] "CURRNET METHOD: lin"
## [1] "COPY LATEST PARAMETERS DIRECTLY FOR NNS.ARMA() IF ERROR:"
## [1] "NNS.ARMA(... method = 'lin' , seasonal.factor = c( 52 ) ...)"
## [1] "CURRENT lin OBJECTIVE FUNCTION = 0.449145584053097"
## [1] "NNS.ARMA(... method = 'lin' , seasonal.factor = c( 52, 49 ) ...)"
## [1] "CURRENT lin OBJECTIVE FUNCTION = 0.364719193840196"
## [1] "NNS.ARMA(... method = 'lin' , seasonal.factor = c( 52, 49, 50 ) ...)"
## [1] "CURRENT lin OBJECTIVE FUNCTION = 0.303033712560494"
## [1] "BEST method = 'lin', seasonal.factor = c( 52, 49, 50 )"
## [1] "BEST lin OBJECTIVE FUNCTION = 0.303033712560494"
## [1] "CURRNET METHOD: nonlin"
## [1] "COPY LATEST PARAMETERS DIRECTLY FOR NNS.ARMA() IF ERROR:"
## [1] "NNS.ARMA(... method = 'nonlin' , seasonal.factor = c( 52, 49, 50 ) ...)"
## [1] "CURRENT nonlin OBJECTIVE FUNCTION = 1.58051085217018"
## [1] "BEST method = 'nonlin' PATH MEMBER = c( 52, 49, 50 )"
## [1] "BEST nonlin OBJECTIVE FUNCTION = 1.58051085217018"
## [1] "CURRNET METHOD: both"
## [1] "COPY LATEST PARAMETERS DIRECTLY FOR NNS.ARMA() IF ERROR:"
## [1] "NNS.ARMA(... method = 'both' , seasonal.factor = c( 52, 49, 50 ) ...)"
## [1] "CURRENT both OBJECTIVE FUNCTION = 0.447117273188387"
## [1] "BEST method = 'both' PATH MEMBER = c( 52, 49, 50 )"
## [1] "BEST both OBJECTIVE FUNCTION = 0.447117273188387"
## $periods
## [1] 52 49 50
##
## $weights
## NULL
##
## $obj.fn
## [1] 0.3030337
##
## $method
## [1] "lin"
##
## $shrink
## [1] FALSE
##
## $nns.regress
## [1] FALSE
##
## $bias.shift
## [1] 0.1079018
##
## $errors
## [1] 0.06841911 -0.23650978 0.23306891 -0.31474170 -0.16347937 0.56078801
## [7] -0.19340157 -0.54788961 -0.34463351 -0.04971714 0.81131522 -1.04034772
## [13] -0.01124973 0.18532001 0.42228850 0.77875534 0.21204992 0.75989291
## [19] 0.03648050 -0.12410190 0.78169808 -0.37190642 0.04673305 0.22143951
## [25] 0.21784535 -0.36207177 0.06303110 0.27494889 0.61355674 -0.36588877
## [31] -0.53670212 -0.59710016 -0.33562214 0.52319489 -0.28558752 -0.06318330
## [37] 0.46174079 0.85423779 -0.17957169 0.88745345 -0.22575406 -0.65533631
## [43] -0.50769155 -0.18710610 -0.19702948 -0.61676209 -0.64456532 -0.60764796
## [49] 0.39155766 -0.99138140 -0.58599672 -0.41332955 -0.35110299 -0.31785231
## [55] -0.33368188 -0.79321483 -0.67548303 -0.29994123 -1.40951519 -0.23496159
## [61] -0.11326961 0.93761236 -1.12638974 0.56134385 -0.82647659 -0.15698867
## [67] -0.66092883 -0.23941287 -0.11793511 -0.13131032 0.23980082 0.11145491
## [73] -0.29324462 0.20996125 1.18368703 0.39817389 0.11233666 0.18104853
## [79] -0.34704039 1.00778283 -0.12855809 -0.44890273 -0.16127326 0.23878907
## [85] 0.08958084 -0.42127816 0.83025782 0.21535622 0.18499525 0.55580864
## [91] -0.63033063 -1.18279040 0.01593275 -0.38943895 -0.73303803 0.24461725
##
## $results
## [1] -0.48668691 -1.12897072 -1.19746701 -1.08366883 -1.17430589 -1.09503747
## [7] -1.27716033 -1.53097703 -1.12872199 -1.25223633 -1.03806114 -1.03996796
## [13] -0.86012134 -0.85334076 -1.29205205 -0.41549038 -0.43645317 -0.70613650
## [19] -0.12979825 -0.20838439 -0.43674783 0.04939343 0.21128735 0.41848130
## [25] 0.58665881 0.65204679 1.11856457 0.81855013 1.33909393 1.17188036
## [31] 1.53195554 1.09195702 1.71916462 1.49064664 1.62340003 1.71600851
## [37] 1.54806110 1.34095102 1.16533567 1.08567248 0.73267472 0.82949748
## [43] 0.65297434 0.09082443 0.55476313 0.53988329 -0.09198186 -0.18380226
##
## $lower.pred.int
## [1] -1.51339152 -2.15567532 -2.22417162 -2.11037344 -2.20101050 -2.12174208
## [7] -2.30386494 -2.55768164 -2.15542660 -2.27894094 -2.06476575 -2.06667256
## [13] -1.88682595 -1.88004537 -2.31875666 -1.44219499 -1.46315778 -1.73284111
## [19] -1.15650286 -1.23508900 -1.46345244 -0.97731118 -0.81541725 -0.60822331
## [25] -0.44004579 -0.37465782 0.09185996 -0.20815448 0.31238932 0.14517575
## [31] 0.50525093 0.06525242 0.69246002 0.46394203 0.59669542 0.68930391
## [37] 0.52135649 0.31424642 0.13863106 0.05896787 -0.29402989 -0.19720713
## [43] -0.37373026 -0.93588018 -0.47194148 -0.48682132 -1.11868647 -1.21050687
##
## $upper.pred.int
## [1] 0.54001770 -0.10226611 -0.17076240 -0.05696423 -0.14760128 -0.06833286
## [7] -0.25045572 -0.50427242 -0.10201738 -0.22553172 -0.01135653 -0.01326335
## [13] 0.16658327 0.17336385 -0.26534744 0.61121423 0.59025144 0.32056811
## [19] 0.89690636 0.81832022 0.58995678 1.07609804 1.23799196 1.44518591
## [25] 1.61336342 1.67875140 2.14526918 1.84525474 2.36579853 2.19858497
## [31] 2.55866015 2.11866163 2.74586923 2.51735125 2.65010464 2.74271312
## [37] 2.57476571 2.36765563 2.19204028 2.11237709 1.75937933 1.85620209
## [43] 1.67967895 1.11752903 1.58146774 1.56658789 0.93472275 0.84290235
Notes. NNS seasonality uses coefficient of variation instead of ACF/PACFs, and NNS ARMA blends multiple seasonal periods into the linear or nonlinear regression forecasts.
Header.
NNS.meboot(x, reps=999, rho=NULL, type="spearman", drift=TRUE, ...)
x_ts <- cumsum(rnorm(350, sd=.7))
mb <- NNS.meboot(x_ts, reps=5, rho = 1)
dim(mb["replicates", ]$replicates)
## [1] 350 5
Header.
NNS.MC(x, reps=30, lower_rho=-1, upper_rho=1, by=.01, exp=1, type="spearman", ...)
mc <- NNS.MC(x_ts, reps=5, lower_rho=-1, upper_rho=1, by=.5, exp=1)
length(mc$ensemble); head(names(mc$replicates),5)
## [1] 350
## [1] "rho = 1" "rho = 0.5" "rho = 0" "rho = -0.5" "rho = -1"
Header.
NNS.rescale(x, a, b, method=c("minmax","riskneutral"), T=NULL, type=c("Terminal","Discounted"))
px <- 100 + cumsum(rnorm(260, sd = 1))
rn <- NNS.rescale(px, a=100, b=0.03, method="riskneutral", T=1, type="Terminal")
c( target = 100*exp(0.03*1), mean_rn = mean(rn) )
## target mean_rn
## 103.0455 103.0455
Interpretation. riskneutral
shifts the
mean to match \(S_0 e^{rT}\) (Terminal)
or \(S_0\) (Discounted), preserving
distributional shape.
Stochastic dominance orders uncertain prospects for broad classes of risk‑averse utilities; partial moments supply practical, nonparametric estimators.
Headers. - NNS.FSD.uni(x, y)
,
NNS.SSD.uni(x, y)
, NNS.TSD.uni(x, y)
-
NNS.SD.cluster(R)
, NNS.SD.efficient.set(R)
RA <- rnorm(240, 0.005, 0.03)
RB <- rnorm(240, 0.003, 0.02)
RC <- rnorm(240, 0.006, 0.04)
NNS.FSD.uni(RA, RB)
## [1] 0
## [1] 0
## [1] 0
## $Clusters
## $Clusters$Cluster_1
## [1] "C" "A" "B"
## Checking 1 of 2Checking 2 of 2
## [1] "C" "A" "B"
Let \((\Omega, \mathcal{F}, \mathbb{P})\) be a probability space, \(X: \Omega\to\mathbb{R}\) measurable. For any fixed \(t\in\mathbb{R}\), the sets \(\{X\le t\}\) and \(\{X>t\}\) are in \(\mathcal{F}\) because they are preimages of Borel sets. The population partial moments are
\[ \operatorname{LPM}(k,t,X) = \int_{-\infty}^{t} (t-x)^k\, dF_X(x), \qquad \operatorname{UPM}(k,t,X) = \int_{t}^{\infty} (x-t)^k\, dF_X(x). \]
The empirical versions correspond to replacing \(F_X\) with the empirical measure \(\mathbb{P}_n\) (or CDF \(\hat F_n\)):
\[ \widehat{\operatorname{LPM}}_k(t;X) = \int_{(-\infty,t]} (t-x)^k\, d\mathbb{P}_n(x), \qquad \widehat{\operatorname{UPM}}_k(t;X) = \int_{(t,\infty)} (x-t)^k\, d\mathbb{P}_n(x). \]
Centering at \(t=\mu_X\) yields the variance decomposition identity in Section 1.
LPM(degree, target, variable)
— lower partial moment of
order degree
at target
.UPM(degree, target, variable)
— upper partial moment of
order degree
at target
.LPM.ratio(degree, target, variable)
;
UPM.ratio(...)
— normalized shares; degree=0
gives CDF.LPM.VaR(p, degree, variable)
— partial-moment quantile
at probability p
.Co.LPM(degree, target, x, y)
— co-lower partial moment
between two variables.Co.UPM(degree, target, x, y)
— co-upper partial moment
between two variables.D.LPM(degree, target, variable)
— divergent lower
partial moment (away from target
).D.UPM(degree, target, variable)
— divergent upper
partial moment (away from target
).NNS.CDF(x, target = NULL, points = NULL, plot = TRUE/FALSE)
— CDF from partial moments.NNS.moments(x)
— mean/var/skew/kurtosis via partial
moments.NNS.mode(x, multi=FALSE)
— nonparametric mode(s).PM.matrix(l_degree, u_degree, target, variable, pop_adj)
— co-/divergent partial-moment matrices.NNS.gravity(x, w = NULL)
— partial-moment weighted
location (gravity center).NNS.norm(x, method = "moment")
— normalization
retaining target moments.See NNS Vignette: Getting Started with NNS: Partial Moments
NNS.dep(x, y)
— nonlinear dependence coefficient.NNS.copula(X, target, continuous, plot, independence.overlay)
— dependence from co-partial moments.See NNS Vignette: Getting Started with NNS: Correlation and Dependence
NNS.ANOVA(control, treatment, ...)
— certainty of
equality (distributions or means).See NNS Vignette: Getting Started with NNS: Comparing Distributions
NNS.part(x, y, ...)
— partition analysis for variable
segmentation.NNS.reg(x, y, ...)
— partition-based
regression/classification ($Fitted.xy
,
$Point.est
).NNS.boost(IVs, DV, ...)
,
NNS.stack(IVs, DV, ...)
— ensembles using
NNS.reg
base learners.NNS.caus(x, y)
— directional causality score.See NNS Vignette: Getting Started with NNS: Clustering and Regression
See NNS Vignette: Getting Started with NNS: Classification
dy.dx(x, y)
— numerical derivative of y
with respect to x
via partial moments.dy.d_(x, Y, var)
— partial derivative of multivariate
Y
w.r.t. var
.NNS.diff(x, y)
— derivative via secant
projections.NNS.ARMA(...)
, NNS.ARMA.optim(...)
—
nonlinear ARMA modeling.NNS.seas(...)
— detect seasonality.NNS.VAR(...)
— nonlinear VAR modeling.NNS.nowcast(x, h, ...)
— near-term nonlinear
forecast.See NNS Vignette: Getting Started with NNS: Forecasting
NNS.meboot(...)
— maximum entropy bootstrap.NNS.MC(...)
— Monte Carlo over correlation space.NNS.rescale(...)
— risk-neutral or min–max
rescaling.See NNS Vignette: Getting Started with NNS: Sampling and Simulation
NNS.FSD.uni(x, y)
, NNS.SSD.uni(x, y)
,
NNS.TSD.uni(x, y)
— univariate stochastic dominance
tests.NNS.SD.cluster(R)
, NNS.SD.efficient.set(R)
— dominance-based portfolio sets.For complete references, please see the Vignettes linked above and their specific referenced materials.