{ "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": [ "" ] }, "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": [ "" ] }, "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": [ "" ] }, "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": [ "" ] }, "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 }