# -*- coding: utf-8 -*-
"""
Created on Tue Nov 16 10:43:21 2021

@author: Sim
"""

import numpy as np
import scipy.stats as st

r = 0.2; n = 50; r0=0; clevel=95

def fisherr(r=0.2, n=50, r0=0, clevel=95):
   z0 = ( 1/2*np.log((1+r)/(1-r)) - 1/2*1/2*np.log((1+r0)/(1-r0)) 
         )/ (1/(n-3)**0.5)
   pval1 = 1-st.norm.cdf(z0)

   z_val = st.norm.ppf(1-(1-clevel/100)/2)
   lower = 1/2*np.log((1+r)/(1-r)) -z_val*np.sqrt(1/(n-3))
   upper = 1/2*np.log((1+r)/(1-r)) +z_val*np.sqrt(1/(n-3))

   lbd = (np.exp(2*lower)-1)/(np.exp(2*lower)+1)
   ubd = (np.exp(2*upper)-1)/(np.exp(2*upper)+1)

   return((z0, pval1, (lbd, ubd)))

def regr(r=0.2, n=50, alternative='greater'):
    t0 = r*np.sqrt(n-2) / np.sqrt(1-r**2)
    if alternative == 'greater':
        pval = 1- st.t.cdf(t0, n-2)
    elif alternative == 'less':
        pval = st.t.cdf(t0, n-2)
    else:
        pval = 2*st.t.cdf(-np.abs(t0), n-2)
    return(t0, pval)

print(fisherr())
print(regr())
print(regr(alternative='less'))
print(regr(alternative='two-sides'))

height = np.array([167, 162, 158, 165, 160, 162, 162, 167, 156, 157])
weight = np.array([68, 49, 50, 56, 52, 52, 50, 61, 44, 55])

r = np.corrcoef(height, weight)[0,1]

print(fisherr(r=r, n=len(height), r0=0.7, clevel=95))
print(regr(r=r,n=len(height), alternative='greater'))

rval, pval = st.pearsonr(height, weight)
print(rval, pval)

'''
R-code

height = c(167, 162, 158, 165, 160, 162, 162, 167, 156, 157)
weight = c(68, 49, 50, 56, 52, 52, 50, 61, 44, 55)
cor.test(height, weight, altertive='greater')

'''