# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#-----------------------------------------------------------------------
# R source file to validate Binomial distribution tests in
# org.apache.commons.math.stat.regression.SimpleRegressionTest
#
# To run the test, install R, put this file and testFunctions
# into the same directory, launch R from this directory and then enter
# source("<name-of-this-file>")
#
# Output will be written to a file named "regTestResults"
# in the directory from which R was launched
#
#------------------------------------------------------------------------------
tol <- 1E-8
#------------------------------------------------------------------------------
# Function definitions

source("testFunctions")           # utility test functions
#------------------------------------------------------------------------------
# infData example

cat("Regresssion test cases\n")

x <- c(15.6, 26.8,37.8,36.4,35.5,18.6,15.3,7.9,0.0)
y <- c(5.2, 6.1, 8.7, 8.5, 8.8, 4.9, 4.5, 2.5, 1.1)
model<-lm(y~x)
coef <- coefficients(summary(model))
intercept <- coef[1, 1]
interceptStd <- coef[1, 2]
slope <- coef[2, 1]
slopeStd <- coef[2, 2]
significance <- coef[2, 4]

output <- "InfData std error test"
if (assertEquals(0.011448491, slopeStd, tol, "Slope Standard Error") &&
    assertEquals(0.286036932, interceptStd, tol, "Intercept Standard Error")) {
    displayPadded(output, SUCCEEDED, WIDTH)
} else {
    displayPadded(output, FAILED, WIDTH)
}

output <- "InfData significance test"
if (assertEquals(4.596e-07, significance, tol, "Significance")) {
    displayPadded(output, SUCCEEDED, WIDTH)
} else {
    displayPadded(output, FAILED, WIDTH)
}

output <- "InfData conf interval test"
ci<-confint(model)
# ci[1,1] = lower 2.5% bound for intercept, ci[1,2] = upper 97.5% for intercept
# ci[2,1] = lower 2.5% bound for slope,     ci[2,2] = upper 97.5% for slope
halfWidth <- ci[2,2] - slope
if (assertEquals(0.0270713794287, halfWidth, tol,
   "Slope conf. interval half-width")) {
    displayPadded(output, SUCCEEDED, WIDTH)
} else {
    displayPadded(output, FAILED, WIDTH)
}
#------------------------------------------------------------------------------
# Norris dataset from NIST examples

y <- c(0.1, 338.8, 118.1, 888.0, 9.2, 228.1, 668.5, 998.5, 449.1, 778.9, 559.2,
0.3, 0.1, 778.1, 668.8, 339.3, 448.9, 10.8, 557.7, 228.3, 998.0, 888.8, 119.6,
0.3, 0.6, 557.6, 339.3, 888.0, 998.5, 778.9, 10.2, 117.6, 228.9, 668.4, 449.2,
0.2)
x <- c(0.2, 337.4, 118.2, 884.6, 10.1, 226.5, 666.3, 996.3, 448.6, 777.0, 558.2,
0.4, 0.6, 775.5, 666.9, 338.0, 447.5, 11.6, 556.0, 228.1, 995.8, 887.6, 120.2,
0.3, 0.3, 556.8, 339.1, 887.2, 999.0, 779.0, 11.1, 118.3, 229.2, 669.1, 448.9,
0.5)
model<-lm(y~x)
coef <- coefficients(summary(model))
intercept <- coef[1, 1]
interceptStd <- coef[1, 2]
slope <- coef[2, 1]
slopeStd <- coef[2, 2]

output <- "Norris std error test"
if (assertEquals(0.429796848199937E-03, slopeStd, tol, "Slope Standard Error")
    && assertEquals(0.232818234301152, interceptStd, tol,
   "Intercept Standard Error")) {
    displayPadded(output, SUCCEEDED, WIDTH)
} else {
    displayPadded(output, FAILED, WIDTH)
}
#------------------------------------------------------------------------------
# infData2 -- bad fit example
#
x <- c(1,2,3,4,5,6)
y <- c(1,0,5,2,-1,12)
model<-lm(y~x)
coef <- coefficients(summary(model))
intercept <- coef[1, 1]
interceptStd <- coef[1, 2]
slope <- coef[2, 1]
slopeStd <- coef[2, 2]
significance <- coef[2, 4]

output <- "InfData2 std error test"
if (assertEquals(1.07260253, slopeStd, tol, "Slope Standard Error") &&
    assertEquals(4.17718672, interceptStd, tol, "Intercept Standard Error")) {
    displayPadded(output, SUCCEEDED, WIDTH)
} else {
    displayPadded(output, FAILED, WIDTH)
}

output <- "InfData2 significance test"
if (assertEquals(0.261829133982, significance, tol, "Significance")) {
    displayPadded(output, SUCCEEDED, WIDTH)
} else {
    displayPadded(output, FAILED, WIDTH)
}

output <- "InfData2 conf interval test"
ci<-confint(model)
# ci[1,1] = lower 2.5% bound for intercept, ci[1,2] = upper 97.5% for intercept
# ci[2,1] = lower 2.5% bound for slope,     ci[2,2] = upper 97.5% for slope
halfWidth <- ci[2,2] - slope
if (assertEquals(2.97802204827, halfWidth, tol,
   "Slope conf. interval half-width")) {
    displayPadded(output, SUCCEEDED, WIDTH)
} else {
    displayPadded(output, FAILED, WIDTH)
}
#------------------------------------------------------------------------------
# Correlation example

x <- c(101.0, 100.1, 100.0, 90.6, 86.5, 89.7, 90.6, 82.8, 70.1, 65.4,
       61.3, 62.5, 63.6, 52.6, 59.7, 59.5, 61.3)
y <- c(99.2, 99.0, 100.0, 111.6, 122.2, 117.6, 121.1, 136.0, 154.2, 153.6,
       158.5, 140.6, 136.2, 168.0, 154.3, 149.0, 165.5)

output <- "Correlation test"
if (assertEquals(-0.94663767742, cor(x,y, method="pearson"), tol,
   "Correlation coefficient")) {
    displayPadded(output, SUCCEEDED, WIDTH)
} else {
    displayPadded(output, FAILED, WIDTH)
}

displayDashes(WIDTH)




