Skip to content

সমাধান — অধ্যায় ৪.৮ · Likelihood Ratio, Wald & Score Tests; Goodness-of-Fit

অধ্যায় ফাইল: part-4-inference/04-08-likelihood-ratio-wald-score-gof.md (§৭ অনুশীলনী)। সংখ্যাগত উত্তর numpy/scipy দিয়ে যাচাইযোগ্য (seed উল্লেখ থাকলে reproducible)। মূল বস্তু — likelihood ratio \(\Lambda=L(\theta_0)/L(\hat\theta)\), LRT statistic \(-2\log\Lambda\xrightarrow{d}\chi^2_k\) (Wilks); Wald \(W=(\hat\theta-\theta_0)^2/\widehat{\mathrm{se}}^{\,2}\); score \(S=U(\theta_0)^2/I(\theta_0)\), \(U(\theta_0)=\ell'(\theta_0)\); Pearson \(\chi^2=\sum_i\frac{(O_i-E_i)^2}{E_i}\) (GOF df \(=k-1-\#\text{আঁচ}\), independence df \(=(r-1)(c-1)\))। চলমান উদাহরণ: E1 LRT; E2 Wald; E3 score; E4 Pearson \(\chi^2\) GOF + independence। (\(\chi^2_{1,0.95}=3.841\), \(\chi^2_{5,0.95}=11.070\)।)


ক · ধারণাগত (conceptual)

সমাধান ১ (★)

  • likelihood ratio \(\Lambda\)\(\Lambda=\dfrac{\sup_{\theta\in\Theta_0}L(\theta)}{\sup_{\theta\in\Theta}L(\theta)}\); simple null-এ \(=\dfrac{L(\theta_0)}{L(\hat\theta)}\)। লব = null-এ সর্বোচ্চ likelihood, হর = সম্পূর্ণ প্যারামিটার-পরিসরে সর্বোচ্চ (অর্থাৎ MLE \(\hat\theta\)-তে)।
  • \(-2\log\Lambda\) — likelihood ratio-এর একটা রূপান্তর যা testing-এ ব্যবহৃত: \(-2\log\Lambda=2[\ell(\hat\theta)-\ell(\theta_0)]\), অর্থাৎ Figure 1-এর উল্লম্ব ড্রপের দ্বিগুণ। (\(\log\)\(\times2\) নেওয়ার কারণ পরের পয়েন্টে — Wilks।)
  • Wilks' theorem\(H_0\) সত্য হলে বড় নমুনায় \(-2\log\Lambda\xrightarrow{d}\chi^2_k\), যেখানে \(k\) = \(H_0\) যতগুলো স্বাধীন প্যারামিটার আটকায়। এই কারণেই ঠিক \(-2\log\Lambda\) (অন্য কোনো রূপান্তর নয়) — এটাই \(\chi^2\) limit দেয়, ফলে \(\chi^2_k\)-table থেকে p-value পাওয়া যায়।

\(0\le\Lambda\le1\) কেন: হর সর্বত্র সর্বোচ্চ likelihood নেয়, লব শুধু \(\Theta_0\subseteq\Theta\)-তে — তাই লব \(\le\) হর, মানে \(\Lambda\le1\); likelihood ধনাত্মক বলে \(\Lambda\ge0\)। জ্যামিতিকভাবে \(\ell(\theta_0)\le\ell(\hat\theta)\) (চূড়াই সর্বোচ্চ, Figure 1)।

\(\Lambda\) ছোট ⇒ \(H_0\)-র বিপক্ষে। \(\Lambda\) ছোট মানে null-এ best likelihood সর্বোচ্চ likelihood-এর চেয়ে অনেক কম — অর্থাৎ null model data-কে অনেক খারাপ ব্যাখ্যা করে। তাই ছোট \(\Lambda\) (সমতুল্যভাবে বড় \(-2\log\Lambda\)) \(H_0\)-র বিপক্ষে প্রমাণ; statistic \(\chi^2_{k,1-\alpha}\) ছাড়ালে \(H_0\) প্রত্যাখ্যান।

সমাধান ২ (★★) — [তিন test-এর তুলনা]

তিনটাই "\(\theta_0\) চূড়া থেকে কত দূরে" মাপে, কিন্তু কোথায় হিসাব করে তা আলাদা (Figure 1):

test কোথায় হিসাব কী ব্যবহার সুবিধা
LRT \(\hat\theta\) \(\theta_0\) — দুই জায়গায় উল্লম্ব ড্রপ \(\ell(\hat\theta)-\ell(\theta_0)\) প্রায়ই সেরা ছোট-নমুনা আচরণ; invariant under reparametrization
Wald শুধু \(\hat\theta\) (চূড়া) অনুভূমিক দূরত্ব \(\hat\theta-\theta_0\) + সেখানকার curvature (\(\widehat{\mathrm{se}}\)) CI বানানো সরাসরি (\(\hat\theta\pm z\,\widehat{\mathrm{se}}\)); MLE থাকলে সহজ
score শুধু \(\theta_0\) (null) ঢাল \(U(\theta_0)\) ও information \(I(\theta_0)\) MLE বের করা লাগে না

MLE ছাড়াই চালানো যায় — score test। Wald ও LRT দুটোতেই \(\hat\theta\) লাগে (Wald-এ অনুভূমিক দূরত্ব ও peak-curvature, LRT-এ চূড়ার উচ্চতা)। কিন্তু score test শুধু \(\theta_0\)-তে ঢাল ও information চায় (Figure 1-এর বেগুনি tangent) — MLE বের করতে হয় না। তাই \(H_0:\theta=\theta_0\) যখন simple এবং MLE বের করা গণনাগতভাবে কঠিন, তখন score test সুবিধাজনক (যেমন Pearson \(\chi^2\), যা আসলে multinomial-এর score test — §৭ Q9)।

সমাধান ৩ (★★)

  • \(O_i\) (observed)\(i\)-তম category-তে সত্যিকারের গণনা (data থেকে)।
  • \(E_i\) (expected)\(H_0\) সত্য হলে প্রত্যাশিত গণনা: \(E_i=n\,p_i^{(0)}\), যেখানে \(p_i^{(0)}\) = null-এর অধীনে \(i\)-তম category-র সম্ভাবনা। (Figure 3-এ fair die: \(E_i=120/6=20\)।)

ভাগে \(E_i\) কেন (শুধু \((O_i-E_i)^2\) নয়): count data-য় একটা category-র সহজাত ওঠানামা তার আকারের সাথে বাড়ে — Poisson/multinomial-এ \(\mathrm{Var}(O_i)\approx E_i\)। তাই \((O_i-E_i)^2\)-কে \(E_i\) দিয়ে ভাগ করলে তফাতটা আপেক্ষিক (standardized) হয়: বড় \(E_i\)-তে বড় absolute তফাত স্বাভাবিক, তাই কম শাস্তি; ছোট \(E_i\)-তে একই absolute তফাত বেশি তাৎপর্যপূর্ণ, তাই বেশি শাস্তি। এই scaling-ই statistic-কে (asymptotically) \(\chi^2\) করে তোলে।

সবচেয়ে বড় অবদান (Figure 3): মুখ "৫", \(O=29,E=20\): \(\frac{(29-20)^2}{20}=\frac{81}{20}=4.05\) — সবচেয়ে বড় mismatch বলে statistic-এ সবচেয়ে বেশি যোগ করে। (মোট \(\chi^2=0.8+1.25+0.2+1.8+4.05+0.2=8.30\)।)

সমাধান ৪ (★★)

"equivalent" মানে। তিন test বড় নমুনায় একই \(\chi^2_k\) limiting distribution মেনে চলে এবং তাদের statistic-মানের অনুপাত \(\to1\) (\(n\to\infty\)) — তাই asymptotically একই p-value ও একই সিদ্ধান্ত দেয়।

ছোট নমুনায় (Figure 4)। তিনটা আলাদা সংখ্যা দেয় (অনুপাত \(\ne1\)): Figure 4-এর বাঁ প্যানেলে ছোট \(n\)-এ Wald সবার ওপরে, score-LRT-Wald স্পষ্ট আলাদা; ডান প্যানেলে \(n=30\)-এ Wald/LRT\(\approx1.42\), score/LRT\(\approx0.94\)। তাই ছোট নমুনায় কোন test বাছছেন তা সিদ্ধান্ত বদলাতে পারে।

আকৃতিগত কারণ (Figure 1-এর সাথে)। বড় নমুনায় log-likelihood তার চূড়ার কাছে প্রায়-নিখুঁত parabola (quadratic approximation: \(\ell(\theta)\approx\ell(\hat\theta)-\frac12 I(\hat\theta)(\theta-\hat\theta)^2\))। একটা parabola-র জন্য — উল্লম্ব ড্রপ (LRT), অনুভূমিক দূরত্বের বর্গ (Wald), আর \(\theta_0\)-তে ঢাল-ভিত্তিক মাপ (score) — তিনটাই একই curvature (Fisher information) দিয়ে হুবহু বাঁধা, তাই মিলে যায় (পূর্ণ প্রমাণ §৭ Q11)।


খ · গাণনিক (computational)

সমাধান ৫ (★) — E1 (LRT)

দেওয়া: \(n=100\), \(x=62\)\(\hat p=0.62\), \(H_0:p_0=0.5\)। $$ -2\log\Lambda=2n\Big[\hat p\log\tfrac{\hat p}{p_0}+(1-\hat p)\log\tfrac{1-\hat p}{1-p_0}\Big] =200\big[0.62\ln\tfrac{0.62}{0.5}+0.38\ln\tfrac{0.38}{0.5}\big]. $$ $$ \ln\tfrac{0.62}{0.5}=\ln1.24=0.21511,\qquad \ln\tfrac{0.38}{0.5}=\ln0.76=-0.27444. $$ $$ -2\log\Lambda=200\big[0.62(0.21511)+0.38(-0.27444)\big]=200(0.133370-0.104287)=200(0.029083)=\boxed{5.82}. $$ \(\chi^2_{1,0.95}=3.841\); যেহেতু \(5.82>3.841\)\(H_0\) প্রত্যাখ্যান (p-value \(=P(\chi^2_1>5.82)\approx0.016\))। মুদ্রাটি সম্ভবত ঝোঁকওয়ালা।

সমাধান ৬ (★★) — E2 (Wald)

একই data। Wald variance MLE-তে হিসাব: \(\widehat{\mathrm{var}}(\hat p)=\dfrac{\hat p(1-\hat p)}{n}=\dfrac{0.62\times0.38}{100}=0.0023560\)। $$ W=\frac{(\hat p-p_0)^2}{\hat p(1-\hat p)/n}=\frac{(0.12)^2}{0.0023560}=\frac{0.0144}{0.0023560}=\boxed{6.11}. $$ \(6.11>3.841\)প্রত্যাখ্যান (p \(\approx0.013\))। LRT-এর \(5.82\)-র কাছাকাছি কিন্তু একটু বড় — ঠিক Figure 4-এর ছোট-\(n\) ছবি (Wald সাধারণত LRT-র চেয়ে কিঞ্চিৎ বড়)। \(n=100\)-এ এখনও পুরো মিল নয়; \(n\) বাড়লে দুটো মিলবে।

সমাধান ৭ (★★) — E3 (score)

একই data। score variance \(p_0\)-তে হিসাব (null-এর অধীনে): \(\dfrac{p_0(1-p_0)}{n}=\dfrac{0.5\times0.5}{100}=0.0025\)। $$ S=\frac{(\hat p-p_0)^2}{p_0(1-p_0)/n}=\frac{(0.12)^2}{0.0025}=\frac{0.0144}{0.0025}=\boxed{5.76}. $$ \(5.76>3.841\)প্রত্যাখ্যান (p \(\approx0.016\))। তিন মান পাশাপাশি: $$ \underbrace{5.76}{\text{score}}\ <\ \underbrace{5.82}. $$ তিনটাই }}\ <\ \underbrace{6.11}_{\text{Wald}\(>3.841\), একই সিদ্ধান্ত, এবং পরস্পর কাছাকাছি — Figure 4-এর ছোট-\(n\) চিত্র (পার্থক্য আছে কিন্তু ছোট)। মূল পার্থক্য: Wald variance \(\hat p\)-তে, score variance \(p_0\)-তে — তাই \(\hat p\)\(p_0\) যত কাছাকাছি, দুটো তত মেলে। (এখানে binomial-এ score statistic ঠিক Pearson \(\chi^2\)-এর সমান — §৭ Q9।)

সমাধান ৮ (★★) — E4 (Pearson \(\chi^2\) GOF)

দেওয়া: \(n=60\), \(O=(8,10,9,12,7,14)\), \(H_0:p_i=1/6\)। $$ E_i=n\,p_i^{(0)}=60\times\tfrac16=10\quad(\text{সব }i). $$ $$ \chi^2=\sum_i\frac{(O_i-E_i)^2}{E_i}=\frac{(8!-!10)^2+(10!-!10)^2+(9!-!10)^2+(12!-!10)^2+(7!-!10)^2+(14!-!10)^2}{10} $$ $$ =\frac{4+0+1+4+9+16}{10}=\frac{34}{10}=\boxed{3.40}. $$ df \(=k-1=6-1=5\) (গণনাগুলোর যোগফল \(n=60\)-এ স্থির, এই এক constraint বাদ দিয়ে; কোনো প্যারামিটার আঁচ করা হয়নি)। \(\chi^2_{5,0.95}=11.070\); যেহেতু \(3.40<11.070\)fair-die hypothesis প্রত্যাখ্যান করা যায় না (p-value \(=P(\chi^2_5>3.40)\approx0.64\))। এই ওঠানামা \(60\) বার গড়ানোয় কেবল randomness দিয়েই ব্যাখ্যাযোগ্য।


গ · প্রমাণভিত্তিক (proof-based)

সমাধান ৯ (★★) — score = Pearson \(\chi^2\) (multinomial)

\(k\)-শ্রেণির multinomial: গণনা \((O_1,\dots,O_k)\), \(\sum_i O_i=n\), প্যারামিটার \((p_1,\dots,p_k)\) with \(\sum p_i=1\)। log-likelihood (constant বাদে): $$ \ell(p)=\sum_{i=1}^{k}O_i\log p_i. $$ constraint \(\sum p_i=1\) সামলাতে \(p_k=1-\sum_{i<k}p_i\) ধরে স্বাধীন প্যারামিটার \((p_1,\dots,p_{k-1})\) নিই। score (১ম ডেরিভেটিভ) \(\theta_0=p^{(0)}\)-তে: $$ U_j=\frac{\partial\ell}{\partial p_j}\Big|{p^{(0)}}=\frac{O_j}{p_j^{(0)}}-\frac{O_k}{p_k^{(0)}}\qquad(j=1,\dots,k-1). $$ Fisher information multinomial-এর: \(I_{jj}=n\big(\frac{1}{p_j^{(0)}}+\frac{1}{p_k^{(0)}}\big)\), \(I_{jl}=\frac{n}{p_k^{(0)}}\) (\(j\ne l\))। score statistic \(S=U^\top I^{-1}U\)। এই quadratic form সরলীকরণ করলে (standard multinomial বীজগণিত — \(I^{-1}\)-এর গঠন ব্যবহার করে, বা সরাসরি \(O_i=np_i^{(0)}+\delta_i\) বসিয়ে \(\sum\delta_i=0\) ব্যবহার করে): $$ S=\sum. $$ অর্থাৎ score statistic }^{k}\frac{(O_i-np_i^{(0)})^2}{np_i^{(0)}}=\sum_{i=1}^{k}\frac{(O_i-E_i)^2}{E_iহুবহু Pearson \(\chi^2\)। df: \(k-1\) স্বাধীন প্যারামিটার, তাই \(S\xrightarrow{d}\chi^2_{k-1}\) — Pearson-এর df-ও \(k-1\)। সুতরাং E3 (score) ও E4 (Pearson GOF) একই জিনিস: Pearson goodness-of-fit statistic হলো multinomial মডেলে \(H_0:p=p^{(0)}\)-এর score test। \(\blacksquare\)

সমাধান ১০ (★★) — Wilks (normal mean, exact)

\(X_1,\dots,X_n\overset{iid}{\sim}\mathcal{N}(\theta,\sigma^2)\), \(\sigma\) জানা; \(H_0:\theta=\theta_0\)। log-likelihood: $$ \ell(\theta)=-\frac{1}{2\sigma^2}\sum_{i=1}^n(X_i-\theta)^2+\text{const},\qquad \hat\theta=\bar X. $$ $$ -2\log\Lambda=2\big[\ell(\hat\theta)-\ell(\theta_0)\big] =\frac{1}{\sigma^2}\Big[\sum_i(X_i-\theta_0)^2-\sum_i(X_i-\bar X)^2\Big]. $$ পরিচিত বিভাজন \(\sum_i(X_i-\theta_0)^2=\sum_i(X_i-\bar X)^2+n(\bar X-\theta_0)^2\) ব্যবহার করলে দুই যোগফলের তফাত হয় \(n(\bar X-\theta_0)^2\): $$ \boxed{-2\log\Lambda=\frac{n(\bar X-\theta_0)^2}{\sigma^2}.} $$ এখন \(H_0\)-র অধীনে \(\bar X\sim\mathcal{N}(\theta_0,\sigma^2/n)\), তাই $$ Z=\frac{\bar X-\theta_0}{\sigma/\sqrt n}\sim\mathcal{N}(0,1)\quad\Longrightarrow\quad -2\log\Lambda=Z^2\sim\chi^2_1\ \text{(exactly)}. $$ সুতরাং এই বিশেষ ক্ষেত্রে (normal data, \(\sigma\) জানা, \(k=1\)) Wilks' theorem asymptotic নয়, exact — সব \(n\)-এ ঠিক \(\chi^2_1\)। এটাই Figure 1-এর উল্লম্ব ড্রপের সূত্র এবং Figure 2-বাঁয়ের (\(k=1\)) histogram-এর তাত্ত্বিক ভিত্তি। \(\blacksquare\)

সমাধান ১১ (★★★) — তিন test-এর asymptotic equivalence

single-parameter; \(\theta_0\) ও MLE \(\hat\theta\), \(I=\) Fisher information। চূড়ায় ঢাল \(\ell'(\hat\theta)=0\), তাই \(\theta_0\)-র কাছে দ্বিতীয়-ক্রম Taylor: $$ \ell(\theta)\approx\ell(\hat\theta)-\tfrac12 I(\hat\theta)\,(\theta-\hat\theta)^2. $$

LRT. \(\theta=\theta_0\) বসিয়ে: $$ -2\log\Lambda=2[\ell(\hat\theta)-\ell(\theta_0)]\approx I(\hat\theta)\,(\hat\theta-\theta_0)^2. $$

Wald. সংজ্ঞা (\(\widehat{\mathrm{se}}^{\,2}=1/I(\hat\theta)\)): $$ W=\frac{(\hat\theta-\theta_0)^2}{\widehat{\mathrm{se}}^{\,2}}=I(\hat\theta)\,(\hat\theta-\theta_0)^2. $$ অর্থাৎ এই approximation-এ \(W\) আর \(-2\log\Lambda\) হুবহু সমান

score. উপরের প্রসারণ থেকে \(\ell'(\theta)\approx -I(\hat\theta)(\theta-\hat\theta)\), তাই \(U(\theta_0)=\ell'(\theta_0)\approx I(\hat\theta)(\hat\theta-\theta_0)\)। score statistic (\(I\) এখানে \(\theta_0\)-তে, কিন্তু \(\hat\theta\xrightarrow{P}\theta_0\) বলে \(I(\theta_0)\approx I(\hat\theta)\)): $$ S=\frac{U(\theta_0)^2}{I(\theta_0)}\approx\frac{[I(\hat\theta)(\hat\theta-\theta_0)]^2}{I(\hat\theta)}=I(\hat\theta)\,(\hat\theta-\theta_0)^2. $$

উপসংহার। তিনটাই \(\approx I\cdot(\hat\theta-\theta_0)^2\) — অর্থাৎ $$ -2\log\Lambda\ \approx\ W\ \approx\ S, $$ পার্থক্য শুধু \(I\) কোথায় হিসাব (\(\hat\theta\) না \(\theta_0\)), যা \(\hat\theta\xrightarrow{P}\theta_0\) হওয়ায় \(n\to\infty\)-এ মুছে যায়। আবার \(H_0\)-র অধীনে \(\sqrt{I(\theta_0)}(\hat\theta-\theta_0)\xrightarrow{d}\mathcal{N}(0,1)\) (MLE-র asymptotic normality, 4.5), তাই তার বর্গ \(\xrightarrow{d}\chi^2_1\) — তিন statistic-ই একই \(\chi^2_1\) limit-এ যায়, আর তাদের অনুপাত \(\to1\) (Figure 4-এর ডান প্যানেল)। (\(k>1\)-এ একই যুক্তি vector-form-এ, \(\xrightarrow{d}\chi^2_k\)।) \(\blacksquare\)


ঘ · কোডিং (coding)

সমাধান ১২ (★★) — Wilks সিমুলেশন

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

rng = np.random.default_rng(0)
n, R = 40, 20000
theta0 = 0.0
xbar = rng.normal(theta0, 1/np.sqrt(n), size=R)
lr = n * xbar**2                       # -2 log Lambda = n*xbar^2 (sigma known) -> chi^2_1

# (ক) histogram vs chi^2_1 density
xx = np.linspace(0.001, 12, 400)
plt.hist(lr, bins=50, density=True, alpha=0.55, label=r"sim $-2\log\Lambda$")
plt.plot(xx, stats.chi2.pdf(xx, df=1), 'r-', lw=2, label=r"$\chi^2_1$")
plt.legend(); plt.xlabel(r"$-2\log\Lambda$")

# (খ) reject rate at 5%
crit = stats.chi2.ppf(0.95, df=1)      # 3.841
print("reject rate:", (lr > crit).mean())
সাধারণ ফল (seed=0): reject rate: 0.0482

ব্যাখ্যা: \(\sigma\) জানা ও data normal হওয়ায় \(-2\log\Lambda=n\bar x^2\) ঠিক \(\chi^2_1\) (§৭ Q10, exact — asymptotic নয়)। তাই (ক) histogram লাল \(\chi^2_1\) curve-এর ওপর বসে যায় (Figure 2-বাঁ), আর (খ) reject rate \(\approx0.05\) — অর্থাৎ \(H_0\) সত্য হলেও পদ্ধতিটা \(\approx5\%\) সময় ভুল করে প্রত্যাখ্যান করে (type I error rate \(\alpha=0.05\), ঠিক যেমন হওয়ার কথা)।

সমাধান ১৩ (★★) — তিন test পাশাপাশি (Bernoulli)

import numpy as np

def three_tests(n, phat, p0=0.5):
    """Bernoulli H0: p = p0. Returns (LRT, Wald, score) statistics."""
    lrt   = 2*n*(phat*np.log(phat/p0) + (1-phat)*np.log((1-phat)/(1-p0)))
    wald  = n*(phat - p0)**2 / (phat*(1-phat))     # variance at MLE
    score = n*(phat - p0)**2 / (p0*(1-p0))         # variance at null p0
    return lrt, wald, score

print("n=100, phat=0.62:", tuple(round(v,3) for v in three_tests(100, 0.62)))
print("n=400, phat=0.56:", tuple(round(v,3) for v in three_tests(400, 0.56)))
সাধারণ ফল:
n=100, phat=0.62: (5.817, 6.112, 5.76)     # প্রশ্ন ৫-৭ যাচাই: LRT, Wald, score
n=400, phat=0.56: (5.774, 5.844, 5.76)     # বড় n + phat কাছে p0 -> তিনটা কাছাকাছি
ব্যাখ্যা: \(n=100,\hat p=0.62\)-এ ঠিক হাতে-হিসাবের মান (LRT \(5.82\), Wald \(6.11\), score \(5.76\)) — তিনটাই \(>3.841\), একই সিদ্ধান্ত। দ্বিতীয় লাইনে \(n\) বড় ও \(\hat p\) (\(0.56\)) \(p_0\)-র কাছাকাছি — তিন মান আরও কাছাকাছি (\(5.77,5.84,5.76\)), Figure 4-এর অভিসরণ। নোট: নিখুঁত equivalence (অনুপাত ঠিক \(\to1\)) দেখতে \(\hat p\)-কেও \(p_0\)-র দিকে আনতে হয় (যেমন \(\hat p_n=p_0+c/\sqrt n\), Figure 4-এর local alternative); \(\hat p\) স্থির রাখলে অনুপাত একটা constant-এ স্থির থাকে, \(1\)-এ নয়।

সমাধান ১৪ (★★★) — \(\chi^2\) test of independence

import numpy as np
from scipy import stats

O = np.array([[30, 20],
              [25, 45]])                 # rows = treatment, cols = outcome

# (ক) হাতে: E_ij = row_i * col_j / n
n = O.sum()
row = O.sum(axis=1, keepdims=True)       # [[50],[70]]
col = O.sum(axis=0, keepdims=True)       # [[55, 65]]
E = row * col / n
chi2_manual = ((O - E)**2 / E).sum()
df = (O.shape[0]-1) * (O.shape[1]-1)     # (2-1)(2-1) = 1
print(f"manual: chi2={chi2_manual:.3f}, df={df}")
print("E =\n", np.round(E, 3))

# (খ) scipy যাচাই
chi2, p, dof, Eexp = stats.chi2_contingency(O, correction=False)
print(f"scipy : chi2={chi2:.3f}, df={dof}, p={p:.4f}")
সাধারণ ফল:
manual: chi2=6.929, df=1
E =
 [[22.917 27.083]
  [32.083 37.917]]
scipy : chi2=6.929, df=1, p=0.0085
ব্যাখ্যা: \(E_{ij}=\frac{\text{row}_i\times\text{col}_j}{n}\) হলো "row ও column স্বাধীন হলে যে গণনা প্রত্যাশিত" (যেমন \(E_{11}=\frac{50\times55}{120}=22.92\))। observed \(O\) এই independence-প্রত্যাশা থেকে যত দূরে, \(\chi^2\) তত বড়। এখানে \(\chi^2=6.93\), df \(=(2-1)(2-1)=1\); \(6.93>\chi^2_{1,0.95}=3.841\) (p \(=0.0085<0.05\)) ⇒ independence প্রত্যাখ্যান — row ও column সম্পর্কিত (treatment-এর সাথে outcome জড়িত)। হাতে-হিসাব ও scipy হুবহু মেলে। মূল কথা: GOF (§৭ Q8) আর independence test একই Pearson \(\chi^2\) যন্ত্র — পার্থক্য শুধু \(E_i\) কোথা থেকে আসে: GOF-এ নির্দিষ্ট \(p_i^{(0)}\) থেকে (df \(=k-1\)), independence-এ marginal total থেকে (df \(=(r-1)(c-1)\))।