{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "f3c832c5", "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", "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": "4392857e", "metadata": {}, "source": [ "# Kohorte / RCT\n", "\n", "Dette er et kohortestudie, da:\n", "\n", "- det tager udgangspunkt i eksponering\n", "- kohorten følges over tid, hvorefter man kigger på udfald\n", "- det finder en årsagssammenhæng\n", "- det undersøger flere udfald samtidig\n", "- det er prospektivt - analytisk\n", "\n", "Forskel på RCT og kohorte:\n", "\n", "- I RCT bestemmer man hvilken eksponering grupperne skal udsættes for, og der kan derfor være blindet\n", "- randomiseret\n", "\n", "Fordele og ulemper ved kohorte:\n", "\n", "- langsomt\n", "- dyrt\n", "- det mindst sårbare studie\n", "- loss to follow-up (bias)\n", "- mange sygdomme (udfald i forhold til eksponering)" ] }, { "cell_type": "markdown", "id": "ffac3d14", "metadata": {}, "source": [ "# Hyppigheds- og associationsmål (3 sæt)" ] }, { "cell_type": "markdown", "id": "9bf576a5", "metadata": {}, "source": [ "## Incidensrate (IR), incidensrate ratio (IRR), incidensrate differens (IRD)" ] }, { "cell_type": "markdown", "id": "cd18552f", "metadata": {}, "source": [ "$$\n", "IR = \\frac{antal\\ nye\\ tilfælde}{samlet\\ persontid\\ i\\ risiko(risikotid)}\n", "$$\n", "\n", "$$\n", "IRR = \\frac{IR_{eksponerede}}{IR_{ikke\\ eksponerede}}\n", "$$\n", "\n", "$$\n", "IRD = IR_{eksponerede} - IR_{ikke\\ eksponerede}\n", "$$\n", "\n", "$H_0$: $IRR=1 \\Leftrightarrow IRD=0$" ] }, { "cell_type": "code", "execution_count": 10, "id": "8f9ea711", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "\n", "$IR = \\frac{antal\\ nye\\ tilfælde}{observationstid\\ i\\ personår}$\n", "\n", "$IR_{eksponerede} = \\frac{130}{6834} \\approx 0.01902 \\approx 1.90%$\\% sv.t. 19 pr. 1000 personår\n", "\n", "$IR_{ikke\\ eksponerede} = \\frac{40}{9228} \\approx 0.00433 \\approx 0.43%$\\% sv.t. 4 pr. 1000 personår\n", "\n", "$IRR = \\frac{IR_{eksponerede}}{IR_{ikke\\ eksponerede}} = \\frac{0.01902}{0.00433} \\approx 4.388$\n", "\n", "$IRD = IR_{eksponerede} - IR_{ikke\\ eksponerede} = 0.01902 - 0.00433 \\approx 0.01469$ sv.t. 15 pr. 1000\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "antal_nye_tilfælde_eksponerede = 130\n", "observationstid_eksponerede = 6834 # Observationstid målt i personår\n", "\n", "antal_nye_tilfælde_ikke_eksponerede = 40\n", "observationstid_ikke_eksponerede = 9228\n", "\n", "\n", "#####################################\n", "ir_eksponerede = antal_nye_tilfælde_eksponerede / observationstid_eksponerede\n", "ir_ikke_eksponerede = antal_nye_tilfælde_ikke_eksponerede / observationstid_ikke_eksponerede\n", "irr = ir_eksponerede / ir_ikke_eksponerede\n", "ird = ir_eksponerede - ir_ikke_eksponerede\n", "\n", "display(Markdown(\n", " rf\"\"\"\n", "$IR = \\frac{{antal\\ nye\\ tilfælde}}{{observationstid\\ i\\ personår}}$\n", "\n", "$IR_{{eksponerede}} = \\frac{{{antal_nye_tilfælde_eksponerede}}}{{{observationstid_eksponerede}}} \\approx {ir_eksponerede:.5f} \\approx {ir_eksponerede:.2%}$\\% sv.t. {ir_eksponerede*1000:.0f} pr. 1000 personår\n", "\n", "$IR_{{ikke\\ eksponerede}} = \\frac{{{antal_nye_tilfælde_ikke_eksponerede}}}{{{observationstid_ikke_eksponerede}}} \\approx {ir_ikke_eksponerede:.5f} \\approx {ir_ikke_eksponerede:.2%}$\\% sv.t. {ir_ikke_eksponerede*1000:.0f} pr. 1000 personår\n", "\n", "$IRR = \\frac{{IR_{{eksponerede}}}}{{IR_{{ikke\\ eksponerede}}}} = \\frac{{{ir_eksponerede:.5f}}}{{{ir_ikke_eksponerede:.5f}}} \\approx {irr:.3f}$\n", "\n", "$IRD = IR_{{eksponerede}} - IR_{{ikke\\ eksponerede}} = {ir_eksponerede:.5f} - {ir_ikke_eksponerede:.5f} \\approx {ird:.5f}$ sv.t. {ird*1000:.0f} pr. 1000\n", "\"\"\"\n", "))" ] }, { "cell_type": "markdown", "id": "a8686b0b", "metadata": {}, "source": [ "## Risiko (KIP), relativ risiko (RR), risiko differens (RD)" ] }, { "cell_type": "markdown", "id": "393753d8", "metadata": {}, "source": [ "$$\n", "KIP = \\frac{antal\\ nye\\ tilfælde\\ i\\ en\\ given\\ periode}{antal\\ personer\\ i\\ risiko\\ ved\\ observationsperiodens\\ start}\n", "$$\n", "\n", "$$\n", "RR = \\frac{KIP_{eksponerede}}{KIP_{ikke\\ eksponerede}}\n", "$$\n", "\n", "$$\n", "RD = KIP_{eksponerede} - KIP_{ikke\\ eksponerede}\n", "$$\n", "\n", "$H_0$: $RR=1 \\Leftrightarrow RD=0$" ] }, { "cell_type": "code", "execution_count": 14, "id": "96e8cc3a", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "\n", "$KIP = \\frac{antal\\ nye\\ tilfælde}{antal\\ personer}$\n", "\n", "$KIP_{eksponerede} = \\frac{130}{656} \\approx 0.19817 \\approx 19.82%$\\%\n", "\n", "$KIP_{ikke\\ eksponerede} = \\frac{40}{787} \\approx 0.05083 \\approx 5.08%$\\%\n", "\n", "$RR = \\frac{KIP_{eksponerede}}{KIP_{ikke\\ eksponerede}} = \\frac{0.19817}{0.05083} \\approx 3.899$\n", "\n", "$RD = KIP_{eksponerede} - KIP_{ikke\\ eksponerede} = 0.19817 - 0.05083 \\approx 0.14734$ sv.t. 147 pr. 1000\n", "\n", "Dette vil altså betyde 147 ekstra tilfælde pr. 1000\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "antal_nye_tilfælde_eksponerede = 130\n", "antal_eksponerede = 656\n", "\n", "antal_nye_tilfælde_ikke_eksponerede = 40\n", "antal_ikke_eksponerede = 787\n", "\n", "\n", "#####################################\n", "kip_eksponerede = antal_nye_tilfælde_eksponerede / antal_eksponerede\n", "kip_ikke_eksponerede = antal_nye_tilfælde_ikke_eksponerede / antal_ikke_eksponerede\n", "rr = kip_eksponerede / kip_ikke_eksponerede\n", "rd = kip_eksponerede - kip_ikke_eksponerede\n", "\n", "display(Markdown(\n", " rf\"\"\"\n", "$KIP = \\frac{{antal\\ nye\\ tilfælde}}{{antal\\ personer}}$\n", "\n", "$KIP_{{eksponerede}} = \\frac{{{antal_nye_tilfælde_eksponerede}}}{{{antal_eksponerede}}} \\approx {kip_eksponerede:.5f} \\approx {kip_eksponerede:.2%}$\\%\n", "\n", "$KIP_{{ikke\\ eksponerede}} = \\frac{{{antal_nye_tilfælde_ikke_eksponerede}}}{{{antal_ikke_eksponerede}}} \\approx {kip_ikke_eksponerede:.5f} \\approx {kip_ikke_eksponerede:.2%}$\\%\n", "\n", "$RR = \\frac{{KIP_{{eksponerede}}}}{{KIP_{{ikke\\ eksponerede}}}} = \\frac{{{kip_eksponerede:.5f}}}{{{kip_ikke_eksponerede:.5f}}} \\approx {rr:.3f}$\n", "\n", "$RD = KIP_{{eksponerede}} - KIP_{{ikke\\ eksponerede}} = {kip_eksponerede:.5f} - {kip_ikke_eksponerede:.5f} \\approx {rd:.5f}$ sv.t. {rd*1000:.0f} pr. 1000\n", "\n", "Dette vil altså betyde {rd*1000:.0f} ekstra tilfælde pr. 1000\n", "\"\"\"\n", "))" ] }, { "cell_type": "markdown", "id": "2f69d5ff", "metadata": {}, "source": [ "## Odds, oddsratio (OR)" ] }, { "cell_type": "markdown", "id": "21428554", "metadata": {}, "source": [ "# Hyppigheds- og associationsmål\n", "\n", "Odds:\n", "\n", "$$\n", "Odds = \\frac{proportion}{1-proportion} = \\frac{eksponerede}{ikke\\ eksponerede}\n", "$$\n", "\n", "hvor proportion er en andel ($0 \\le proportion \\le 1$). Odds fortæller hvor mange eksponerede, der er for hver _ikke_ eksponeret.\n", "\n", "Oddsratio (OR):\n", "\n", "$$\n", "OR = \\frac{Odds_{cases}}{Odds_{kontroller}}\n", "$$\n", "\n", "Oddsratio giver hvor mange gange større risiko der er for sygdom, hvis man er eksponeret.\n", "\n", "- Hvis $OR \\gt 1$: forøget risiko for sygdom, hvis du er eksponeret\n", "- Hvis $OR \\lt 1$: reduceret risiko for sygdom, hvis du er eksponeret\n", "\n", "$H_0$: $OR=1$" ] }, { "cell_type": "code", "execution_count": 13, "id": "cdda6f48", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "\n", "$odds_{blodprop} = \\frac{26}{32} = 0.8125$\n", "\n", "$odds_{kontrol} = \\frac{10}{106} = 0.0943$\n", "\n", "$OR = \\frac{odds_{blodprop}}{odds_{kontrol}} = \\frac{0.8125}{0.0943} \\approx 8.6125$\n", "\n", "Der er 7.61 gange større risiko for blodprop, hvis man er eksponeret, i forhold til hvis man ikke er eksponeret.\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "udfald = 'blodprop' # Fx blodprop\n", "\n", "antal_syge_eksponerede = 26\n", "antal_syge_ikke_eksponerede = 32\n", "\n", "antal_raske_eksponerede = 10\n", "antal_raske_ikke_eksponerede = 106\n", "\n", "\n", "#####################################\n", "odds_syge = antal_syge_eksponerede / antal_syge_ikke_eksponerede\n", "odds_kontrol = antal_raske_eksponerede / antal_raske_ikke_eksponerede\n", "oddsratio = odds_syge / odds_kontrol\n", "\n", "display(Markdown(\n", " rf\"\"\"\n", "$odds_{{{udfald}}} = \\frac{{{antal_syge_eksponerede}}}{{{antal_syge_ikke_eksponerede}}} = {odds_syge:.4f}$\n", "\n", "$odds_{{kontrol}} = \\frac{{{antal_raske_eksponerede}}}{{{antal_raske_ikke_eksponerede}}} = {odds_kontrol:.4f}$\n", "\n", "$OR = \\frac{{odds_{{{udfald}}}}}{{odds_{{kontrol}}}} = \\frac{{{odds_syge:.4f}}}{{{odds_kontrol:.4f}}} \\approx {oddsratio:.4f}$\n", "\n", "Der er {oddsratio-1:.2f} gange større risiko for {udfald}, hvis man er eksponeret, i forhold til hvis man ikke er eksponeret.\n", "\"\"\"\n", "))" ] }, { "cell_type": "code", "execution_count": null, "id": "9d077dff", "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 }