224 lines
7.8 KiB
Plaintext
224 lines
7.8 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "4ae75850",
|
|
"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": "4f6c9952",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Case-kontrol\n",
|
|
"\n",
|
|
"Dette er et case-kontrol studie, da:\n",
|
|
"\n",
|
|
"- Deltagerne udvælges på baggrund af udfaldet (sygdommen/lidelsen)\n",
|
|
"- Perspektivet er retrospektivt, dvs. man ser tilbage på eksponeringen\n",
|
|
"- Både casene (de syge) og kontrollerne (de raske) har været udsat for eksponering og ikke-eksponering (indenfor den hver gruppe, ikke det enkelte individ)\n",
|
|
"\n",
|
|
"Fordel og ulemper:\n",
|
|
"\n",
|
|
"- Hurtige og billige\n",
|
|
"- Mindre sårbare end tværsnitstudier, men mere sårbare end kohorte studier\n",
|
|
"- Ofte selektions- og re-call bias\n",
|
|
"- En sygdom kan skyldes mange eksponeringer. Man kan tage højde for diverse eksponeringer, men kan kun undersøge én eksponering pr. studie\n",
|
|
"- God til sjældne sygdomme, da studiet tager udgangspunkt i udfaldet og man derfor ikke behøver at rekruttere kæmpe stikprøver"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "5a1c374c",
|
|
"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",
|
|
"Nulhypotese: $OR=1$"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"id": "9ef67735",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/markdown": [
|
|
"\n",
|
|
"### 2x2-tabel\n",
|
|
"\n",
|
|
"| | blodprop | Ikke blodprop | I alt |\n",
|
|
"| :-------------- | :----------------------------------: | :-----------------------------------: | ----------------------------------------: |\n",
|
|
"| Eksponeret | 26 | 10 | 36 |\n",
|
|
"| Ikke eksponeret | 32 | 106 | 138 |\n",
|
|
"| I alt | 58 | 116 | **174** |\n"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.Markdown object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/markdown": [
|
|
"\n",
|
|
"### Hyppigheds- og associationsmål\n",
|
|
"\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": [
|
|
"<IPython.core.display.Markdown object>"
|
|
]
|
|
},
|
|
"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",
|
|
"sum_udfald = antal_syge_eksponerede + antal_syge_ikke_eksponerede\n",
|
|
"sum_ikke_udfald = antal_raske_eksponerede + antal_raske_ikke_eksponerede\n",
|
|
"sum_eksponerede = antal_syge_eksponerede + antal_raske_eksponerede\n",
|
|
"sum_ikke_eksponerede = antal_syge_ikke_eksponerede + antal_raske_ikke_eksponerede\n",
|
|
"\n",
|
|
"display(Markdown(\n",
|
|
" rf\"\"\"\n",
|
|
"### 2x2-tabel\n",
|
|
" \n",
|
|
"| | {udfald} | Ikke {udfald} | I alt |\n",
|
|
"| :-------------- | :----------------------------------: | :-----------------------------------: | ----------------------------------------: |\n",
|
|
"| Eksponeret | {antal_syge_eksponerede} | {antal_raske_eksponerede} | {sum_eksponerede} |\n",
|
|
"| Ikke eksponeret | {antal_syge_ikke_eksponerede} | {antal_raske_ikke_eksponerede} | {sum_ikke_eksponerede} |\n",
|
|
"| I alt | {sum_udfald} | {sum_ikke_udfald} | **{sum_udfald + sum_ikke_udfald}** |\n",
|
|
"\"\"\"\n",
|
|
"))\n",
|
|
"\n",
|
|
"display(Markdown(\n",
|
|
" rf\"\"\"\n",
|
|
"### Hyppigheds- og associationsmål\n",
|
|
"\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": "e2898b72",
|
|
"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
|
|
}
|