Frank
Frank
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.metrics import mean_absolute_error, mean_squared_error
from scipy.optimize import minimize
exp_theta_u = np.exp(-self.theta * u)
exp_theta_v = np.exp(-self.theta * v)
exp_theta_uv = np.exp(-self.theta * (u + v))
@staticmethod
def fit(data_u):
def log_likelihood(theta):
if theta <= 0:
return np.inf
u, v = data_u[:, 0], data_u[:, 1]
likelihood = FrankCopula.frank_copula_static(u, v, theta)
likelihood = np.clip(likelihood, 1e-10, None) # Avoid log of zero
return -np.sum(np.log(likelihood))
initial_theta = 1.0
bounds = [(1e-5, None)]
result = minimize(log_likelihood, initial_theta, bounds=bounds)
return result.x[0]
@staticmethod
def frank_copula_static(u, v, theta):
if theta == 0:
return u * v # No dependency
copula_value = -1 / theta * np.log(
1 + (np.exp(-theta * u) - 1) * (np.exp(-theta * v) - 1) / (np.exp(-
theta) - 1))
return np.clip(copula_value, 1e-10, None) # Avoid log of zero
data = pd.DataFrame({
'Rainfall': rainfall,
'Temperature': temperature
})
return df
# Visualization
plt.figure(figsize=(12, 6))
plt.scatter(data['Rainfall'], data['Temperature'], alpha=0.5, color='blue',
label='Original Data')
plt.scatter(samples_frank_df['Rainfall'], samples_frank_df['Temperature'],
alpha=0.5, color='orange',
label='Frank Copula Samples')
plt.title('Original Data vs. Frank Copula Samples')
plt.xlabel('Rainfall')
plt.ylabel('Temperature')
plt.grid()
plt.legend()
plt.show()
mae_temperature = mean_absolute_error(original['Temperature'],
simulated['Temperature'])
mse_temperature = mean_squared_error(original['Temperature'],
simulated['Temperature'])
rmse_temperature = np.sqrt(mse_temperature)