# -*- coding: utf-8 -*-
"""
Created on Tue Jan  4 14:49:50 2022

@author: Sim
"""
import numpy as np
import scipy.stats as st

r = 0.2; n = 50; r0=0; clevel=95

def fisherr2(r=0.2, n=50, r0=0, clevel=95, alternative='two-sided'):
   z0 = ( 1/2*np.log((1+r)/(1-r)) - 1/2*1/2*np.log((1+r0)/(1-r0)) 
         )/ (1/(n-3)**0.5)
   if alternative == 'greater':
      pval1 = 1-st.norm.cdf(z0)
   elif alternative == 'less':
      pval1 = st.norm.cdf(z0)
   else:
      pval1 = 2*st.norm.cdf(-np.abs(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)))

print(fisherr2(alternative='two-sided'))
print(fisherr2(alternative='less'))
print(fisherr2(alternative='greater'))


