# Import necessary libraries import streamlit as st import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm import plotly.graph_objects as go # Define the functions from your code def Phi(z): return norm.cdf(z) def phi(z): return norm.pdf(z) # Define the BCNOLLN CDF based on the provided formula def F_BCNOLLN(y1, y2, mu1, sigma1, alpha1, beta1, mu2, sigma2, alpha2, beta2, lambd): # Convert y1, y2 to z-scores z1 = (y1 - mu1) / sigma1 z2 = (y2 - mu2) / sigma2 # Compute H functions H1_z1 = Phi(z1)**alpha1 + (1 - Phi(z1))**beta1 H2_z2 = Phi(z2)**alpha2 + (1 - Phi(z2))**beta2 # Compute the BCNOLLN CDF term1 = (Phi(z1)*alpha1 / H1_z1)**(-lambd) term2 = (Phi(z2)*alpha2 / H2_z2)**(-lambd) term = term1 + term2 - 1 cdf = term**(-1/lambd) return cdf def f_BCNOLLN(y1, y2, mu1, sigma1, alpha1, beta1, mu2, sigma2, alpha2, beta2, lambd): z1 = (y1 - mu1) / sigma1 z2 = (y2 - mu2) / sigma2 H1_z1 = Phi(z1)**alpha1 + (1 - Phi(z1))**beta1 H2_z2 = Phi(z2)**alpha2 + (1 - Phi(z2))**beta2 term1 = (Phi(z1)**alpha1 / H1_z1)**(-lambd) term2 = (Phi(z2)**alpha2 / H2_z2)**(-lambd) common_term = (term1 + term2 - 1)**(-(2*lambd + 1)/lambd) factor1 = (phi(z1) * Phi(z1)**(alpha1 - 1) * (1 - Phi(z1))**(beta1 - 1) * (alpha1 + (beta1 - alpha1) * Phi(z1))) / (sigma1 * H1_z1**2) factor2 = (phi(z2) * Phi(z2)**(alpha2 - 1) * (1 - Phi(z2))**(beta2 - 1) * (alpha2 + (beta2 - alpha2) * Phi(z2))) / (sigma2 * H2_z2**2) pdf = (lambd + 1) * common_term * (factor1 * factor2) return pdf # Streamlit app st.title('BCNOLLN Distribution Visualizer') # Input fields for parameters mu1 = st.sidebar.number_input('Mean μ1', value=0.0) sigma1 = st.sidebar.number_input('Standard deviation σ1', value=1.0, min_value=0.1) alpha1 = st.sidebar.number_input('Alpha1 α1', value=0.2, min_value=0.0, max_value=1.0) beta1 = st.sidebar.number_input('Beta1 β1', value=0.2, min_value=0.0, max_value=1.0) mu2 = st.sidebar.number_input('Mean μ2', value=0.0) sigma2 = st.sidebar.number_input('Standard deviation σ2', value=1.0, min_value=0.1) alpha2 = st.sidebar.number_input('Alpha2 α2', value=0.9, min_value=0.0, max_value=1.0) beta2 = st.sidebar.number_input('Beta2 β2', value=0.3, min_value=0.0, max_value=1.0) lambd = st.sidebar.number_input('Lambda λ', value=-0.5) # Generate y1 and y2 values y1, y2 = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100)) # Calculate PDF values pdf_values = f_BCNOLLN(y1, y2, mu1, sigma1, alpha1, beta1, mu2, sigma2, alpha2, beta2, lambd) # Calculate CDF values cdf_values = F_BCNOLLN(y1, y2, mu1, sigma1, alpha1, beta1, mu2, sigma2, alpha2, beta2, lambd) # Plotting #fig, ax = plt.subplots() #cp = ax.contourf(y1, y2, pdf_values, cmap='viridis') #fig.colorbar(cp) #ax.set_title('BCNOLLN PDF Contour Plot') #ax.set_xlabel('y1') #ax.set_ylabel('y2') # Create a 3D contour plot with Plotly fig = go.Figure(data=[go.Surface(z=pdf_values, x=y1, y=y2, colorscale='Viridis')]) fig.update_layout(title='BCNOLLN PDF 3D Contour Plot', autosize=True, scene=dict( xaxis_title='y1', yaxis_title='y2', zaxis_title='PDF' )) # Display the plot in Streamlit st.plotly_chart(fig) # Create a 3D contour plot with Plotly fig = go.Figure(data=[go.Surface(z=cdf_values, x=y1, y=y2, colorscale='Viridis')]) fig.update_layout(title='BCNOLLN CDF 3D Contour Plot', autosize=True, scene=dict( xaxis_title='y1', yaxis_title='y2', zaxis_title='PDF' )) # Display the plot in Streamlit st.plotly_chart(fig) #st.pyplot(fig)