BioStatistik/To Numeriske.ipynb

312 lines
9.8 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "0ba6d314",
"metadata": {},
"outputs": [],
"source": [
"# Imports\n",
"\n",
"from IPython.display import display, Markdown\n",
"from scipy.stats import chi2_contingency\n",
"from scipy.stats import t as t_test\n",
"import numpy as np\n",
"import math\n",
"t_value = t_test.isf\n",
"\n",
"def _display_table(data_array, row_names=None, col_names=None):\n",
" _row_num = len(data_array)\n",
" _col_num = len(data_array[0])\n",
" _rows = []\n",
" for i in range(_row_num):\n",
" row = f'| {row_names[i]} |'\n",
" for j in range(_col_num):\n",
" row += f' {data_array[i][j]:.1f} |'\n",
" row += f' {sum(data_array[i]):.0f} |'\n",
" _rows.append(row)\n",
" _total_row = '| **Total** |'\n",
" _col_tots = 0\n",
" for i in range(_col_num):\n",
" col_tot = 0\n",
" for j in range(_row_num):\n",
" col_tot += data_array[j][i]\n",
" _col_tots += col_tot\n",
" _total_row += f' **{col_tot:.0f}** |'\n",
" _total_row += f' **{_col_tots:.0f}** |'\n",
" display(Markdown(\n",
" rf\"\"\"\n",
"| | {' | '.join(col_names + ['Total'])} |\n",
"{'|-'*(len(row_names) + 2)} |\n",
"{'\\n'.join(_rows)}\n",
"{_total_row}\n",
"\"\"\"\n",
"))\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "e0a72880",
"metadata": {},
"source": [
"# Uparret t-test\n",
"\n",
"$$\n",
"SD_{fælles} = \\sqrt{\\frac{(n_1-1)\\cdot SD_1^2 + (n_2-1)\\cdot SD_2^2}{n_1 + n_2 - 2}}\n",
"$$\n",
"\n",
"$$\n",
"se(\\bar{x}_1 - \\bar{x}_2) = \\sqrt{\\frac{1}{n_1} + \\frac{1}{n_2}} \\cdot SD_{fælles}\n",
"$$\n",
"\n",
"$$\n",
"t(x) = \\frac{\\bar{x}_1 - \\bar{x}_2}{se(\\bar{x}_1 - {\\bar{x}_2})}\n",
"$$\n",
"\n",
"$$\n",
"df = n_1 + n_2 - 2\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "7e734740",
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"\n",
"$H_0: \\mu_1 = \\mu_2 \\Rightarrow \\mu_1 - \\mu_2 = 0$\n",
"\n",
"Test: uparret t-test med $df = 150 + 300 - 2 = 448$ frihedsgrader\n",
"\n",
"$SD_{fælles} = \\sqrt{ \\frac{ (n_1 - 1)\\cdot SD_1^2 + (n_2-1) \\cdot SD_2^2 }{ n_1 + n_2 - 2 } } = \\sqrt{ \\frac{ (150 - 1)\\cdot 1.7^2 + (300-1) \\cdot 1.8^2 }{ 150 + 300 - 2 } } = 1.7674$\n",
"\n",
"$se(\\bar{x_1} - \\bar{x_2}) = \\sqrt{\\frac{1}{n_1} + \\frac{1}{n_2}} \\cdot SD_{fælles} = \\sqrt{\\frac{1}{150} + \\frac{1}{300}} \\cdot 1.7674 = 0.1767$\n",
"\n",
"$t(x) = \\frac{\\bar{x_1} - \\bar{x_2}}{se(\\bar{x_1} - \\bar{x_2})} = \\frac{21.9 - 21.6}{0.1767} = 1.6974$\n",
"\n",
"For en t-test med 448 frihedsgrader og et signifikansniveau på $\\alpha = 0.05$ er den kritiske værdi for $t(x) = 1.9653$.\n"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"\n",
"Da teststørrelsen $t(x)$ er mindre end den kritiske værdi, kan nulhypotesen $H_0: \\mu_1 - \\mu_2 = 0$ ikke forkastes.\n"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"middel1 = 21.9\n",
"n1 = 150\n",
"sd1 = 1.7\n",
"\n",
"middel2 = 21.6\n",
"n2 = 300\n",
"sd2 = 1.8\n",
"\n",
"\n",
"\n",
"###############################\n",
"dof = n1 + n2 - 2\n",
"sd_fælles = math.sqrt(((n1-1)*sd1**2 + (n2-1)*sd2**2) / (n1 + n2 - 2))\n",
"se_fælles = math.sqrt(1/n1 + 1/n2) * sd_fælles\n",
"t_x = (middel1 - middel2)/(se_fælles)\n",
"crit_t = t_test.ppf(1-0.05/2, dof)\n",
"\n",
"display(Markdown(\n",
" rf\"\"\"\n",
"$H_0: \\mu_1 = \\mu_2 \\Rightarrow \\mu_1 - \\mu_2 = 0$\n",
"\n",
"Test: uparret t-test med $df = {n1} + {n2} - 2 = {dof}$ frihedsgrader\n",
"\n",
"$SD_{{fælles}} = \\sqrt{{ \\frac{{ (n_1 - 1)\\cdot SD_1^2 + (n_2-1) \\cdot SD_2^2 }}{{ n_1 + n_2 - 2 }} }} = \\sqrt{{ \\frac{{ ({n1} - 1)\\cdot {sd1}^2 + ({n2}-1) \\cdot {sd2}^2 }}{{ {n1} + {n2} - 2 }} }} = {sd_fælles:.4f}$\n",
"\n",
"$se(\\bar{{x_1}} - \\bar{{x_2}}) = \\sqrt{{\\frac{{1}}{{n_1}} + \\frac{{1}}{{n_2}}}} \\cdot SD_{{fælles}} = \\sqrt{{\\frac{{1}}{{{n1}}} + \\frac{{1}}{{{n2}}}}} \\cdot {sd_fælles:.4f} = {se_fælles:.4f}$\n",
"\n",
"$t(x) = \\frac{{\\bar{{x_1}} - \\bar{{x_2}}}}{{se(\\bar{{x_1}} - \\bar{{x_2}})}} = \\frac{{{middel1} - {middel2}}}{{{se_fælles:.4f}}} = {t_x:.4f}$\n",
"\n",
"For en t-test med {dof} frihedsgrader og et signifikansniveau på $\\alpha = 0.05$ er den kritiske værdi for $t(x) = {crit_t:.4f}$.\n",
"\"\"\"\n",
"))\n",
"\n",
"if t_x > crit_t:\n",
" display(Markdown(\n",
" rf\"\"\"\n",
"Da teststørrelsen $t(x)$ er større end den kritiske værdi, kan nulhypotesen $H_0: \\mu_1 - \\mu_2 = 0$ forkastes.\n",
"\"\"\"\n",
" ))\n",
"else:\n",
" display(Markdown(\n",
" rf\"\"\"\n",
"Da teststørrelsen $t(x)$ er mindre end den kritiske værdi, kan nulhypotesen $H_0: \\mu_1 - \\mu_2 = 0$ ikke forkastes.\n",
"\"\"\"\n",
" ))"
]
},
{
"cell_type": "markdown",
"id": "2ad5beff",
"metadata": {},
"source": [
"# Konfidensintervallet for forskellen på middelværdierne\n",
"\n",
"$$\n",
"95\\% CI(\\mu_1 - \\mu_2) = \\bar{x}_1 - \\bar{x}_2 \\pm t' \\cdot se(\\bar{x}_1 - \\bar{x}_2)\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "c4d47453",
"metadata": {},
"outputs": [],
"source": [
"middel1 = 21.9\n",
"n1 = 150\n",
"sd1 = 1.7\n",
"\n",
"middel2 = 21.6\n",
"n2 = 300\n",
"sd2 = 1.8\n",
"\n",
"dof = n1 + n2 - 2\n",
"sd_fælles = math.sqrt(((n1-1)*sd1**2 + (n2-1)*sd2**2) / (n1 + n2 - 2))\n",
"se_fælles = math.sqrt(1/n1 + 1/n2) * sd_fælles"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "bdc8cd82",
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"\n",
"$\\bar{x}_1 = 21.9$\n",
"\n",
"$\\bar{x}_2 = 21.6$\n",
"\n",
"$SD_{fælles} = \\sqrt{ \\frac{ (n_1 - 1)\\cdot SD_1^2 + (n_2-1) \\cdot SD_2^2 }{ n_1 + n_2 - 2 } } = \\sqrt{ \\frac{ (150 - 1)\\cdot 1.7^2 + (300-1) \\cdot 1.8^2 }{ 150 + 300 - 2 } } = 1.7674$\n",
"\n",
"$se(\\bar{x_1} - \\bar{x_2}) = \\sqrt{\\frac{1}{n_1} + \\frac{1}{n_2}} \\cdot SD_{fælles} = \\sqrt{\\frac{1}{150} + \\frac{1}{300}} \\cdot 1.7674 = 0.1767$\n",
"\n",
"$95\\% CI(\\mu_1 - \\mu_2) = \\bar{x}_1 - \\bar{x}_2 \\pm t' \\cdot se(\\bar{x}_1 - \\bar{x}_2)$\n",
"\n",
"$= 21.9 - 21.6 \\pm 1.965 \\cdot 0.177$\n",
"\n",
"$= 0.300 \\pm 0.347 = \\left[-0.047\\ ;\\ 0.647\\right]$\n"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/markdown": [
"\n",
"Da $0$ er inkluderet i $95\\%CI$, kan der ikke siges at være signifikant forskel på middelværdierne.\n"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"####################################\n",
"t_værdi = t_value(0.025, dof)\n",
"t_se = t_værdi * se_fælles\n",
"middel_dif = middel1 - middel2\n",
"interval_lav = middel_dif - t_se\n",
"interval_høj = middel_dif + t_se\n",
"\n",
"display(Markdown(\n",
" rf\"\"\"\n",
"$\\bar{{x}}_1 = {middel1}$\n",
"\n",
"$\\bar{{x}}_2 = {middel2}$\n",
"\n",
"$SD_{{fælles}} = \\sqrt{{ \\frac{{ (n_1 - 1)\\cdot SD_1^2 + (n_2-1) \\cdot SD_2^2 }}{{ n_1 + n_2 - 2 }} }} = \\sqrt{{ \\frac{{ ({n1} - 1)\\cdot {sd1}^2 + ({n2}-1) \\cdot {sd2}^2 }}{{ {n1} + {n2} - 2 }} }} = {sd_fælles:.4f}$\n",
"\n",
"$se(\\bar{{x_1}} - \\bar{{x_2}}) = \\sqrt{{\\frac{{1}}{{n_1}} + \\frac{{1}}{{n_2}}}} \\cdot SD_{{fælles}} = \\sqrt{{\\frac{{1}}{{{n1}}} + \\frac{{1}}{{{n2}}}}} \\cdot {sd_fælles:.4f} = {se_fælles:.4f}$\n",
"\n",
"$95\\% CI(\\mu_1 - \\mu_2) = \\bar{{x}}_1 - \\bar{{x}}_2 \\pm t' \\cdot se(\\bar{{x}}_1 - \\bar{{x}}_2)$\n",
"\n",
"$= {middel1} - {middel2} \\pm {t_værdi:.3f} \\cdot {se_fælles:.3f}$\n",
"\n",
"$= {middel_dif:.3f} \\pm {t_se:.3f} = \\left[{middel_dif - t_se:.3f}\\ ;\\ {middel_dif + t_se:.3f}\\right]$\n",
"\"\"\"\n",
"))\n",
"\n",
"if np.sign(interval_lav) != np.sign(interval_høj):\n",
" display(Markdown(\n",
" rf\"\"\"\n",
"Da $0$ er inkluderet i $95\\%CI$, kan der ikke siges at være signifikant forskel på middelværdierne.\n",
"\"\"\"\n",
" ))\n",
"else:\n",
" display(Markdown(\n",
" rf\"\"\"\n",
"Da $0$ ikke er inkluderet i $95\\%CI$, kan der siges at være signifikant forskel på middelværdierne.\n",
"\"\"\"\n",
" ))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "984d104a",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "base",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}