3import matplotlib.pyplot
as plt
4from math
import sqrt, pi, exp
7rng = np.random.default_rng(42)
10 R = np.asarray(R, dtype=float)
11 L = np.linalg.cholesky(R)
12 z = rng.standard_normal(size=(n_samples, R.shape[0]))
18 sample_corr = np.corrcoef(y, rowvar=
False)
20 means = y.mean(axis=0)
21 stds = y.std(axis=0, ddof=1)
26 "max|corr_error|": float(np.max(np.abs(err))),
27 "mean|corr_error|": float(np.mean(np.abs(err))),
28 "max|mean|": float(np.max(np.abs(means))),
29 "max|std-1|": float(np.max(np.abs(stds - 1.0))),
30 "min_cholesky_diag": float(np.min(np.diag(np.linalg.cholesky(R)))),
32 return y, L, sample_corr, err, means, stds, summary
35 R = np.full((n, n), rho, dtype=float)
36 np.fill_diagonal(R, 1.0)
40 (
"Identity (no correlation)", np.eye(3)),
42 (
"Block: rho12=0.8, var3 indep", np.array([[1.0, 0.8, 0.0],
44 [0.0, 0.0, 1.0]], dtype=float)),
52 y, L, sample_corr, err, means, stds, summary =
summarize_case(name, R, n_samples=60000)
53 all_summaries.append(summary)
58 "sample_corr": sample_corr,
64summary_df = pd.DataFrame(all_summaries).set_index(
"case")
67 df_corr = pd.DataFrame(results[name][
"sample_corr"])
68 df_err = pd.DataFrame(results[name][
"err"])
70for name, data
in results.items():
71 sample_corr = data[
"sample_corr"]
76 plt.imshow(sample_corr, vmin=-1, vmax=1)
77 plt.title(f
"Empirical correlation matrix – {name}")
83 plt.imshow(R, vmin=-1, vmax=1)
84 plt.title(f
"Target correlation matrix – {name}")
91 plt.scatter(subset[:, 0], subset[:, 1], s=5)
92 plt.title(f
"Scatter: y1 vs y2 – {name}")
100 plt.hist(vals, bins=60, density=
True)
101 xs = np.linspace(vals.min(), vals.max(), 400)
102 pdf = (1.0 / sqrt(2 * pi)) * np.exp(-0.5 * xs * xs)
104 plt.title(f
"Histogram of y1 (with N(0,1) pdf) – {name}")
106 plt.ylabel(
"density")
generate_correlated(R, n_samples, rng)
summarize_case(name, R, n_samples=50000)