further work on introduction
@@ -13,11 +13,12 @@
|
||||
\graphicspath{{resources/figures/}}
|
||||
|
||||
\usepackage{blindtext}
|
||||
%\usepackage[style=ieee, backend=biber]{biblatex}
|
||||
\usepackage[style=ieee, backend=biber]{biblatex}
|
||||
\addbibresource{../main.bib}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{pdflscape}
|
||||
\usepackage{adjustbox}
|
||||
|
||||
% Document
|
||||
\begin{document}
|
||||
@@ -28,7 +29,7 @@
|
||||
|
||||
\includegraphics[width=7cm]{leipzig_university_logo}\\[1cm] % Adjust size as needed
|
||||
|
||||
{\huge \textbf{Body-Core Temperature based Ovulation Prediction with Machine Learning}}\\[1.5cm]
|
||||
{\huge \textbf{Body-Core Temperature based Fertility Prediction with Machine Learning}}\\[1.5cm]
|
||||
|
||||
\textbf{Master’s Thesis}\\[1cm]
|
||||
|
||||
@@ -68,6 +69,7 @@
|
||||
|
||||
\include{sections/conclusion}
|
||||
|
||||
|
||||
\section*{Declaration of Use of AI-Assisted Writing Tools}
|
||||
|
||||
Parts of this thesis were prepared with the assistance of generative AI tools, including OpenAI’s ChatGPT .
|
||||
|
||||
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 235 KiB |
@@ -1,68 +1,61 @@
|
||||
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" version="28.0.7">
|
||||
<diagram name="Page-1" id="PlemIjn8Fl2o5CNH3s3k">
|
||||
<mxGraphModel dx="1177" dy="772" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
|
||||
<mxGraphModel dx="907" dy="731" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-5" target="-91SqtgMbv2aO-WyCwji-20">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="-91SqtgMbv2aO-WyCwji-5" target="-91SqtgMbv2aO-WyCwji-20" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="140" y="590" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="100" y="320" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-16" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="-91SqtgMbv2aO-WyCwji-15">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-16" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="-91SqtgMbv2aO-WyCwji-15" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.4862" y="-2" relative="1" as="geometry">
|
||||
<mxPoint x="42" y="2" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-5" target="-91SqtgMbv2aO-WyCwji-18">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="-91SqtgMbv2aO-WyCwji-5" target="-91SqtgMbv2aO-WyCwji-18" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-23" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="-91SqtgMbv2aO-WyCwji-21">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-23" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="-91SqtgMbv2aO-WyCwji-21" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.6517" y="-2" relative="1" as="geometry">
|
||||
<mxPoint x="51" y="-2" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-5" value="Would<div>have</div><div>Sex?</div>" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-5" value="Would<div>have</div><div>Sex?</div>" style="rhombus;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="260" y="270" width="100" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-53" target="-91SqtgMbv2aO-WyCwji-5">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="-91SqtgMbv2aO-WyCwji-53" target="-91SqtgMbv2aO-WyCwji-5" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="310" y="230" as="sourcePoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-18" target="-91SqtgMbv2aO-WyCwji-31">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="-91SqtgMbv2aO-WyCwji-18" target="-91SqtgMbv2aO-WyCwji-31" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="340" y="470" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-29" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="-91SqtgMbv2aO-WyCwji-27">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-29" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="-91SqtgMbv2aO-WyCwji-27" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.0491" y="2" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-18" target="-91SqtgMbv2aO-WyCwji-50">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="700.0344827586207" y="520" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="720" y="450" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-52" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="-91SqtgMbv2aO-WyCwji-44">
|
||||
<mxGeometry x="-0.4528" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-18" value="Predicted Fertiltiy &gt; Threshold" style="rhombus;whiteSpace=wrap;html=1;spacingTop=11;" vertex="1" parent="1">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-18" value="Predicted Fertiltiy &gt; Threshold" style="rhombus;whiteSpace=wrap;html=1;spacingTop=11;" parent="1" vertex="1">
|
||||
<mxGeometry x="490" y="390" width="120" height="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-20" value="<font color="#121212"><span>No Sex</span></font>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="20" y="700" width="120" height="60" as="geometry" />
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-20" value="<font color="#121212"><span>No Sex</span></font>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="820" width="410" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-26" value="Correct Denial" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxCell id="bCSMd4uCS7QxRfL7xKaz-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-26" target="-91SqtgMbv2aO-WyCwji-20">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-26" value="Correct Denial" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="170" y="700" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-31" target="-91SqtgMbv2aO-WyCwji-26">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="-91SqtgMbv2aO-WyCwji-31" target="-91SqtgMbv2aO-WyCwji-26" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="310" y="560" />
|
||||
@@ -70,12 +63,12 @@
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-36" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="-91SqtgMbv2aO-WyCwji-33">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-36" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="-91SqtgMbv2aO-WyCwji-33" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.1239" y="1" relative="1" as="geometry">
|
||||
<mxPoint x="-1" y="68" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-31" target="-91SqtgMbv2aO-WyCwji-32">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="-91SqtgMbv2aO-WyCwji-31" target="-91SqtgMbv2aO-WyCwji-32" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="310" y="560" />
|
||||
@@ -83,49 +76,72 @@
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-38" value="<font style="font-size: 16px;">Yes</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="-91SqtgMbv2aO-WyCwji-34">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-38" value="<font style="font-size: 16px;">Yes</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="-91SqtgMbv2aO-WyCwji-34" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.1408" y="-1" relative="1" as="geometry">
|
||||
<mxPoint x="14" y="89" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-31" value="Actual Fertility &lt; Threshold" style="rhombus;whiteSpace=wrap;html=1;spacingTop=8;" vertex="1" parent="1">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-31" value="Actual Fertility &lt; Threshold" style="rhombus;whiteSpace=wrap;html=1;spacingTop=8;" parent="1" vertex="1">
|
||||
<mxGeometry x="250" y="390" width="120" height="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-32" value="Incorrect Denial" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxCell id="bCSMd4uCS7QxRfL7xKaz-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-32" target="-91SqtgMbv2aO-WyCwji-20">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-32" value="Incorrect Denial" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="330" y="700" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-41" value="Pregnancy" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="480" y="700" width="120" height="60" as="geometry" />
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-41" value="Pregnancy" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="490" y="820" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-47" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-50" target="-91SqtgMbv2aO-WyCwji-41">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-47" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="-91SqtgMbv2aO-WyCwji-50" target="-91SqtgMbv2aO-WyCwji-41" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="640" y="550" as="sourcePoint" />
|
||||
<mxPoint x="650" y="670" as="sourcePoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-49" value="(X &lt;= P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=17;" vertex="1" connectable="0" parent="-91SqtgMbv2aO-WyCwji-47">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-49" value="(X &lt;= P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=17;" parent="-91SqtgMbv2aO-WyCwji-47" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.0505" y="1" relative="1" as="geometry">
|
||||
<mxPoint x="-1" y="73" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-48" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-50" target="-91SqtgMbv2aO-WyCwji-46">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-48" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="-91SqtgMbv2aO-WyCwji-50" target="-91SqtgMbv2aO-WyCwji-46" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="700.0344827586207" y="580" as="sourcePoint" />
|
||||
<mxPoint x="710.0344827586207" y="700" as="sourcePoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-51" value="(X &gt; P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="-91SqtgMbv2aO-WyCwji-48">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-51" value="(X &gt; P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="-91SqtgMbv2aO-WyCwji-48" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.1219" y="1" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-46" value="No Pregnancy" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="660" y="700" width="120" height="60" as="geometry" />
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-46" value="No Pregnancy" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="670" y="820" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-50" value="<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">Actual Fertility as&nbsp;</span><div style="forced-color-adjust: none; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; box-shadow: none !important;">Probability P</div>" style="rhombus;whiteSpace=wrap;html=1;fontColor=default;labelBackgroundColor=none;spacingTop=5;" vertex="1" parent="1">
|
||||
<mxGeometry x="660" y="500" width="120" height="120" as="geometry" />
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-50" value="<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">Actual Fertility as&nbsp;</span><div style="forced-color-adjust: none; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; box-shadow: none !important;">Probability P</div>" style="rhombus;whiteSpace=wrap;html=1;fontColor=default;labelBackgroundColor=none;spacingTop=5;" parent="1" vertex="1">
|
||||
<mxGeometry x="670" y="620" width="120" height="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-53" value="Sample User" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxCell id="-91SqtgMbv2aO-WyCwji-53" value="Sample User" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="250" y="180" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="bCSMd4uCS7QxRfL7xKaz-4" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="-91SqtgMbv2aO-WyCwji-18" target="bCSMd4uCS7QxRfL7xKaz-3">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="720" y="630" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="730" y="450" />
|
||||
</Array>
|
||||
<mxPoint x="610" y="450" as="sourcePoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="bCSMd4uCS7QxRfL7xKaz-5" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="bCSMd4uCS7QxRfL7xKaz-4">
|
||||
<mxGeometry x="-0.4528" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="bCSMd4uCS7QxRfL7xKaz-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="bCSMd4uCS7QxRfL7xKaz-3" target="-91SqtgMbv2aO-WyCwji-50">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="bCSMd4uCS7QxRfL7xKaz-3" value="<div><span style="color: light-dark(rgb(18, 18, 18), rgb(222, 222, 222)); background-color: transparent;">Sex</span></div>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="675" y="500" width="110" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
|
||||
@@ -1,109 +1,135 @@
|
||||
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" version="28.0.7">
|
||||
<diagram name="Page-1" id="UWC5B8n8PBnU2zgIg5ZY">
|
||||
<mxGraphModel dx="1118" dy="733" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
|
||||
<mxGraphModel dx="1028" dy="729" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-1" target="WKEbJVpTUuC8SgsnX6qr-2">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="WKEbJVpTUuC8SgsnX6qr-1" target="WKEbJVpTUuC8SgsnX6qr-2" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-1" value="Sample User" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-1" value="Sample User" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="240" y="80" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-2" target="WKEbJVpTUuC8SgsnX6qr-4">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="WKEbJVpTUuC8SgsnX6qr-2" target="WKEbJVpTUuC8SgsnX6qr-4" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-32" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="WKEbJVpTUuC8SgsnX6qr-17">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-32" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="WKEbJVpTUuC8SgsnX6qr-17" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.2673" y="2" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-2" target="WKEbJVpTUuC8SgsnX6qr-18">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="WKEbJVpTUuC8SgsnX6qr-2" target="WKEbJVpTUuC8SgsnX6qr-18" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-31" value="<font style="font-size: 16px;">Yes</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WKEbJVpTUuC8SgsnX6qr-19">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-31" value="<font style="font-size: 16px;">Yes</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="WKEbJVpTUuC8SgsnX6qr-19" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.389" y="-3" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-2" value="Predicted Fertility &gt; Threshold" style="rhombus;whiteSpace=wrap;html=1;spacingTop=9;" vertex="1" parent="1">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-2" value="Predicted Fertility &gt; Threshold" style="rhombus;whiteSpace=wrap;html=1;spacingTop=9;" parent="1" vertex="1">
|
||||
<mxGeometry x="235" y="190" width="130" height="130" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-4" target="WKEbJVpTUuC8SgsnX6qr-7">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="WKEbJVpTUuC8SgsnX6qr-4" target="WKEbJVpTUuC8SgsnX6qr-7" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-28" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="WKEbJVpTUuC8SgsnX6qr-26">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-28" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="WKEbJVpTUuC8SgsnX6qr-26" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.6233" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-4" target="WKEbJVpTUuC8SgsnX6qr-8">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="WKEbJVpTUuC8SgsnX6qr-4" target="WKEbJVpTUuC8SgsnX6qr-8" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-30" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="WKEbJVpTUuC8SgsnX6qr-27">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-30" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="WKEbJVpTUuC8SgsnX6qr-27" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.6233" y="-3" relative="1" as="geometry">
|
||||
<mxPoint x="3" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-4" value="Actual Fertility &gt;<div>Threshold</div>" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-4" value="Actual Fertility &gt;<div>Threshold</div>" style="rhombus;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="650" y="322.5" width="120" height="125" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-7" value="Incorrect Deferral" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxCell id="b1BseiM-DmnXS_ALsRTH-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-7" target="WKEbJVpTUuC8SgsnX6qr-20">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="630" y="800" as="targetPoint" />
|
||||
<Array as="points">
|
||||
<mxPoint x="630" y="810" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-7" value="Incorrect Deferral" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="570" y="620" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-8" value="Correct Deferral" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxCell id="b1BseiM-DmnXS_ALsRTH-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-8" target="WKEbJVpTUuC8SgsnX6qr-20">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="790" y="810" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-8" value="Correct Deferral" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="730" y="620" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-9" value="Pregnancy" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="245" y="620" width="120" height="60" as="geometry" />
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-9" value="Pregnancy" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="250" y="679.47" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-15" target="WKEbJVpTUuC8SgsnX6qr-9">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="WKEbJVpTUuC8SgsnX6qr-15" target="WKEbJVpTUuC8SgsnX6qr-9" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="390" y="470" as="sourcePoint" />
|
||||
<mxPoint x="405" y="595" as="sourcePoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-11" value="(X &lt;= P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=17;" vertex="1" connectable="0" parent="WKEbJVpTUuC8SgsnX6qr-10">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-11" value="(X &lt;= P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=17;" parent="WKEbJVpTUuC8SgsnX6qr-10" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.0505" y="1" relative="1" as="geometry">
|
||||
<mxPoint x="-38" y="37" as="offset" />
|
||||
<mxPoint x="-42" y="24" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-15" target="WKEbJVpTUuC8SgsnX6qr-14">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="WKEbJVpTUuC8SgsnX6qr-15" target="WKEbJVpTUuC8SgsnX6qr-14" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="450.0344827586207" y="500" as="sourcePoint" />
|
||||
<mxPoint x="465.0344827586207" y="625" as="sourcePoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-13" value="(X &gt; P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="WKEbJVpTUuC8SgsnX6qr-12">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-13" value="(X &gt; P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="WKEbJVpTUuC8SgsnX6qr-12" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.1219" y="1" relative="1" as="geometry">
|
||||
<mxPoint x="62" y="39" as="offset" />
|
||||
<mxPoint x="46" y="26" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-14" value="No Pregnancy" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="410" y="620" width="120" height="60" as="geometry" />
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-14" value="No Pregnancy" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="415" y="679.47" width="120" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-15" value="<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">Actual Fertility as&nbsp;</span><div style="forced-color-adjust: none; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; box-shadow: none !important;">Probability P</div>" style="rhombus;whiteSpace=wrap;html=1;fontColor=default;labelBackgroundColor=none;spacingTop=5;" vertex="1" parent="1">
|
||||
<mxGeometry x="330" y="325" width="120" height="120" as="geometry" />
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-15" value="<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">Actual Fertility as&nbsp;</span><div style="forced-color-adjust: none; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; box-shadow: none !important;">Probability P</div>" style="rhombus;whiteSpace=wrap;html=1;fontColor=default;labelBackgroundColor=none;spacingTop=5;" parent="1" vertex="1">
|
||||
<mxGeometry x="345" y="450" width="120" height="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-18" target="WKEbJVpTUuC8SgsnX6qr-20">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="WKEbJVpTUuC8SgsnX6qr-18" target="WKEbJVpTUuC8SgsnX6qr-20" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="140" y="610" />
|
||||
<mxPoint x="140" y="610" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-25" value="(X &gt; P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="WKEbJVpTUuC8SgsnX6qr-21">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-25" value="(X &gt; P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="WKEbJVpTUuC8SgsnX6qr-21" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.0301" y="1" relative="1" as="geometry">
|
||||
<mxPoint x="-1" y="38" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="WKEbJVpTUuC8SgsnX6qr-18" target="WKEbJVpTUuC8SgsnX6qr-15">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="WKEbJVpTUuC8SgsnX6qr-18" target="b1BseiM-DmnXS_ALsRTH-7" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-24" value="(X &lt;= P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" vertex="1" connectable="0" parent="WKEbJVpTUuC8SgsnX6qr-22">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-24" value="(X &lt;= P)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=16;" parent="WKEbJVpTUuC8SgsnX6qr-22" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.337" y="1" relative="1" as="geometry">
|
||||
<mxPoint x="7" y="1" as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-18" value="Intercourse&nbsp;<div>Probability as P</div>" style="rhombus;whiteSpace=wrap;html=1;spacingTop=-1;" vertex="1" parent="1">
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-18" value="Intercourse&nbsp;<div>Probability as P</div>" style="rhombus;whiteSpace=wrap;html=1;spacingTop=-1;" parent="1" vertex="1">
|
||||
<mxGeometry x="75" y="320" width="130" height="130" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-20" value="No Sex" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="80" y="620" width="120" height="60" as="geometry" />
|
||||
<mxCell id="WKEbJVpTUuC8SgsnX6qr-20" value="No Sex" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="85" y="780" width="450" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="b1BseiM-DmnXS_ALsRTH-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="b1BseiM-DmnXS_ALsRTH-7" target="WKEbJVpTUuC8SgsnX6qr-15">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="b1BseiM-DmnXS_ALsRTH-7" value="Sex" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="350" y="355" width="110" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
|
||||
|
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 259 KiB After Width: | Height: | Size: 259 KiB |
|
Before Width: | Height: | Size: 225 KiB After Width: | Height: | Size: 225 KiB |
@@ -7,25 +7,18 @@
|
||||
\subsection{Physiological Background}\label{subsec:physiological_background}
|
||||
|
||||
\subsubsection{Menstrual Cycle}\label{subsec:menstrual_cycle}
|
||||
The menstrual cycle describes the physiological changes in the female body that prepare it for pregnancy.
|
||||
It is divided into two phases: the \textbf{follicular phase} and the \textbf{luteal phase}.
|
||||
\\
|
||||
During the follicular phase, the ovarian follicles mature, and the endometrium (the inner lining of the uterus) thickens
|
||||
in preparation for a potential implantation of a fertilized egg.
|
||||
Around day 14 of a typical cycle, ovulation occurs, marking the transition to the luteal phase.
|
||||
Ovulation refers to the rupture of the mature ovarian follicle and the release of an egg cell into the fallopian tube.
|
||||
The menstrual cycle consists of physiological changes preparing the female body for potential pregnancy,
|
||||
typically spanning around 28 days but varying considerably among individuals.
|
||||
It includes two main phases: the follicular phase, beginning with menstruation, and the luteal phase, following ovulation.
|
||||
|
||||
Ovulation is triggered by a surge in \textbf{luteinizing hormone (LH)}
|
||||
and \textbf{follicle-stimulating hormone (FSH)}, following a peak in estradiol levels.
|
||||
As ovulation occurs, estradiol levels drop, progesterone levels begin to rise and a slight increase in body temperature
|
||||
(typically around 0.5°C) can be observed.
|
||||
This marks the beginning of the luteal phase.
|
||||
During the follicular phase, ovarian follicles mature under the influence of rising estradiol levels, thickening the uterine lining (endometrium).
|
||||
Around mid-cycle, a surge of luteinizing hormone (LH) and follicle-stimulating hormone (FSH), triggered by peak estradiol,
|
||||
induces ovulation—the release of a mature egg into the fallopian tube.
|
||||
|
||||
During the luteal phase, the endometrium thickens further, creating an optimal environment for embryo implantation.
|
||||
LH and FSH levels decrease, while progesterone remains elevated to support endometrial maintenance.
|
||||
If fertilization does not occur, progesterone levels drop, leading to the shedding of the endometrial lining along
|
||||
with the unfertilized egg.
|
||||
This process, known as menstruation, marks the beginning of a new cycle.
|
||||
After ovulation, the luteal phase begins.
|
||||
Progesterone increases substantially, maintaining endometrial thickness for potential embryo implantation.
|
||||
In parallel, a subtle rise in body temperature (~0.5°C) occurs due to progesterone elevation.
|
||||
If fertilization does not happen, progesterone and temperature decline back to baseline levels, resulting in menstruation and initiating a new cycle.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
@@ -36,27 +29,23 @@ This process, known as menstruation, marks the beginning of a new cycle.
|
||||
\label{fig:background_menstrual_cycle_physiology}
|
||||
\end{figure}
|
||||
|
||||
The menstrual cycle typically lasts around 28 days, with ovulation occurring near the midpoint.
|
||||
However, variations, particularly in the follicular phase length, are common and can be influenced by factors such as stress, diet, exercise and age~\cite{silberstein_physiology_2000}.
|
||||
Figure~\ref{fig:background_menstrual_cycle_physiology} provides a detailed overview of the hormonal and physiological changes throughout the menstrual cycle.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{resources/figures/background/background_labeled_cycle}
|
||||
\caption{Body core temperature curve across a menstrual cycle. The red line represents a locally smoothed temperature trend.
|
||||
Menstruation, ovulation, and the fertile phase are indicated in red, blue, and green, respectively.}
|
||||
Menstruation, ovulation, and the fertile window are indicated in red, blue, and green, respectively.}
|
||||
\label{fig:background_labeled_cycle}
|
||||
\end{figure}
|
||||
|
||||
Figure~\ref{fig:background_menstrual_cycle_physiology} illustrates these physiological changes, highlighting hormonal fluctuations and temperature shifts around ovulation.
|
||||
The menstrual cycle length varies significantly, influenced by factors such as stress, age, diet, and exercise~\cite{silberstein_physiology_2000}.
|
||||
|
||||
Figure~\ref{fig:background_labeled_cycle} shows the temperature curve over the course of a menstrual cycle with the
|
||||
menstruation, fertile phase and ovulation marked.
|
||||
menstruation, fertile window and ovulation marked.
|
||||
It starts with a menstruation and ends just before the next menstruation.
|
||||
The follicular phase starts at the beginning and goes on until the ovulation.
|
||||
The luteal phase begins at the ovulation and continues until the next menstruation.
|
||||
|
||||
Not every cycle results in ovulation—a phenomenon known as anovulation—which leads to a monophasic temperature pattern.
|
||||
Anovulation can have various causes, including hormonal imbalances, stress, or underlying health conditions~\cite{rosenfield_adolescent_2013}.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{resources/figures/background/background_anovulatory_cycle}
|
||||
@@ -65,25 +54,28 @@ Anovulation can have various causes, including hormonal imbalances, stress, or u
|
||||
\end{figure}
|
||||
|
||||
|
||||
Anovulation is reflected in temperature data as either an absence of a clear temperature rise or a rise
|
||||
that is insufficient in magnitude or duration to be considered a reliable indicator of ovulation.
|
||||
Distinguishing between ovulatory and anovulatory cycles is challenging, as the only definitive confirmation of
|
||||
successful ovulation in a clinical sense is a positive pregnancy test.
|
||||
While many cycles exhibit a characteristic biphasic pattern, deviations from this norm are common.
|
||||
Some remain monophasic, which might be an indication for an anovulatory cycle, which is a menstrual cycle, where no ovulation occurs.
|
||||
Anovulation can have various causes, including hormonal imbalances, stress, or underlying health conditions~\cite{rosenfield_adolescent_2013}.
|
||||
Monophasic cycles with a confirmed ovulation event have been observed, so there seems to be no clear indication that it is a direct cause of anovulation~\cite{moghissi_accuracy_1976}.
|
||||
Thus, distinguishing between ovulatory and anovulatory cycles is challenging, as the only definitive confirmation of
|
||||
successful ovulation in a clinical sense is a pregnancy.
|
||||
Even ultrasound imaging can only confirm that an egg was released from its follicle—not whether it was successfully implanted or fertilized.
|
||||
Figure~\ref{fig:background_anovulation} shows a cycle that does not have an ovulation, and thus no resulting temperature rise.
|
||||
|
||||
Figure~\ref{fig:background_anovulation} shows a cycle with a monophasic temperature pattern.
|
||||
|
||||
To illustrate the diversity of real-world menstrual cycles, Figures~\ref{fig:background_long_cycle} and~\ref{fig:background_short_cycle}
|
||||
show examples of cycles that are significantly longer or shorter than a normative 28-day cycle.
|
||||
\citeauthor{bull_real-world_2019} have done an extensive study on cycle variability,
|
||||
highlighting that women frequently deviate from the normative cycle, especially with age\cite{bull_real-world_2019}.
|
||||
|
||||
\begin{figure}[htb]
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{resources/figures/background/background_long_cycle}
|
||||
\caption{Example of a long cycle with a length of 111 days}
|
||||
\label{fig:background_long_cycle}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[htb]
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{resources/figures/background/background_short_cycle}
|
||||
\caption{Example of a short cycle with a length of 22 days}
|
||||
@@ -93,36 +85,28 @@ show examples of cycles that are significantly longer or shorter than a normativ
|
||||
These irregularities appear not only on a per-cycle basis, but also across time within the same individual.
|
||||
Figures~\ref{fig:background_irregular_cycles} and~\ref{fig:background_regular_cycles}
|
||||
show examples of a woman with an irregular and a regular menstrual cycle pattern, respectively.
|
||||
Raw body core temperature readings are shown in light blue, with a red line indicating smoothing by local regression.
|
||||
Vertical dotted black lines mark the beginning of each cycle.
|
||||
The irregular example highlights how multiple parameters can vary between individuals:
|
||||
cycle length, timing of ovulation, temperature shift magnitude between phases, and intra-phase temperature variability.
|
||||
This multidimensional variability underscores the need for adaptive, data-driven models capable of learning personalized patterns---
|
||||
rather than relying on population-wide assumptions.
|
||||
For a regular cycle pattern, sophisticated analysis or predictions are often not necessary, as the last ovulation day
|
||||
can reliably be used as the next.
|
||||
|
||||
\begin{figure}[htb]
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{resources/figures/background/background_irregular_cycle_example}
|
||||
\caption{Example of a woman with irregular menstrual rhythm}
|
||||
\caption{Example of a woman with irregular menstrual rhythm. The dashed vertical lines indicate the ends of each cycle.}
|
||||
\label{fig:background_irregular_cycles}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{resources/figures/background/background_regular_cycle_example}
|
||||
\caption{Example of a woman with regular menstrual rhythm}
|
||||
\caption{Example of a woman with regular menstrual rhythm. The dashed vertical lines indicate the ends of each cycle.}
|
||||
\label{fig:background_regular_cycles}
|
||||
\end{figure}
|
||||
|
||||
\subsubsection{Fertility Prediction}\label{subsubsec:fertility_prediction}
|
||||
Throughout the menstrual cycle, the chance of fertilization varies significantly.
|
||||
An egg cell released from the ovary during ovulation, can be fertilized for up to 24 hours.
|
||||
However, since male sperm cells can survive up to 6 days inside the female reproductive tract,
|
||||
the fertile window is typically defined as the five days before ovulation until one day after ovulation~\cite{dunson_day-specific_1999}.
|
||||
Research by~\citeauthor{dunson_day-specific_1999} has shown that the highest chance of fertilization is around one day before ovulation,
|
||||
as illustrated in Figure~\ref{fig:background_pregnancy_chance}.
|
||||
Fertility varies throughout the menstrual cycle, centered around the ovulation event.
|
||||
An egg remains viable for about 24 hours post-ovulation, while sperm can survive up to 6 days in a woman's reproductive tract,
|
||||
thus the fertile period extends to approximately five days prior to ovulation~\cite{dunson_day-specific_1999}.
|
||||
Consequently, the whole fertile window generally spans six days: five days preceding ovulation and one day after.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
@@ -132,11 +116,30 @@ as illustrated in Figure~\ref{fig:background_pregnancy_chance}.
|
||||
\label{fig:background_pregnancy_chance}
|
||||
\end{figure}
|
||||
|
||||
It is important to note that fertility prediction is inherently dependent on ovulation prediction.
|
||||
Since the probability of conception is tightly linked to ovulation timing, the accuracy of fertility prediction methods
|
||||
is constrained by the precision of ovulation detection.
|
||||
This relationship underscores the necessity of developing reliable ovulation prediction models,
|
||||
as even small inaccuracies can significantly impact fertility assessments.
|
||||
Figure~\ref{fig:background_pregnancy_chance} demonstrates the probability of fertilization peaking one day before ovulation, emphasizing the critical timing for fertility prediction.
|
||||
|
||||
Fertility prediction fundamentally depends on accurate ovulation timing.
|
||||
However, since the goal is to identify the fertile window before ovulation occurs, detection must be early and precise.
|
||||
For individuals trying to conceive or avoid pregnancy, knowing the window of fertility is more actionable than identifying the ovulation event itself.
|
||||
|
||||
\subsubsection{Practical Use Cases}\label{subsubsec:practical_use_cases}
|
||||
In this study, we will focus on \emph{natural family planning} (NFP), which includes preventing and achieving pregnancy.
|
||||
Individuals aiming to avoid pregnancy identify fertile days to abstain from intercourse,
|
||||
whereas those seeking pregnancy aim to focus intercourse around days with the highest fertility probability.
|
||||
|
||||
Both use cases revolve around accurately predicting ovulation.
|
||||
However, the implications of prediction errors differ significantly.
|
||||
A false-positive prediction indicates high fertility despite actual fertility being low or nonexistent,
|
||||
whereas a false-negative prediction implies low fertility when fertility is actually high.
|
||||
|
||||
For women aiming to avoid pregnancy, minimizing false-negative predictions is crucial due to the risk of unintended pregnancy.
|
||||
Although false-positives may lead to unnecessary abstinence, this outcome is generally considered less severe.
|
||||
Consequently, prediction algorithms should be conservative, erring on the side of higher fertility estimates to prioritize safety.
|
||||
|
||||
Conversely, for women aiming to conceive, false-positive predictions could misdirect efforts toward incorrect cycle days,
|
||||
causing frustration or delays.
|
||||
False-negatives have fewer negative consequences.
|
||||
Therefore, algorithms for this group should prefer cautious fertility estimates, reducing the risk of misdirected effort.
|
||||
|
||||
\subsubsection{Physiological Signs of Ovulation}\label{subsubsec:physiological_signs}
|
||||
Several physiological signs correlate with ovulation and can be used for prediction.
|
||||
@@ -154,26 +157,7 @@ detecting the slight temperature rise that follows ovulation.
|
||||
Advances in wearable technology have further enabled continuous and automated temperature monitoring,
|
||||
improving accessibility and usability~\cite{alexander_fertilitatsmonitoring_2014, luo_detection_2020, yu_tracking_2022}.
|
||||
|
||||
\subsubsection{Use Cases of Fertility Prediction}\label{subsubsec:use_cases_of_ovulation_prediction}
|
||||
The prediction of ovulation and corresponding fertility within a menstrual cycle serves two distinct use cases.
|
||||
Specifically, we will focus on \emph{natural family planning} (NFP), which includes preventing and achieving pregnancy.
|
||||
Individuals aiming to avoid pregnancy identify fertile days to abstain from intercourse,
|
||||
whereas those seeking pregnancy aim to focus intercourse around days with the highest fertility probability.
|
||||
|
||||
Both use cases revolve around accurately predicting ovulation.
|
||||
However, the implications of prediction errors differ significantly.
|
||||
A false-positive prediction indicates high fertility despite actual fertility being low or nonexistent,
|
||||
whereas a false-negative prediction implies low fertility when fertility is actually high.
|
||||
|
||||
For women aiming to avoid pregnancy, minimizing false-negative predictions is crucial due to the risk of unintended pregnancy.
|
||||
Although false-positives may lead to unnecessary abstinence, this outcome is generally considered less severe.
|
||||
Consequently, prediction algorithms should be conservative, erring on the side of higher fertility estimates to prioritize safety.
|
||||
|
||||
Conversely, for women aiming to conceive, false-positive predictions could misdirect efforts toward incorrect cycle days,
|
||||
causing frustration or delays.
|
||||
False-negatives have fewer negative consequences.
|
||||
Therefore, algorithms for this group should prefer cautious fertility estimates,
|
||||
reducing the risk of misdirected effort.
|
||||
Among the available methods, temperature-based monitoring, especially when automated and continuous, offers a promising avenue for large-scale cycle analysis.
|
||||
|
||||
\subsection{Data Source and Characteristics}\label{subsec:data_background}
|
||||
This study is based on a dataset collected from users of the \emph{OvulaRing}~\cite{noauthor_ovularing_nodate},
|
||||
@@ -202,14 +186,15 @@ Therefore, all user-entered cycle starts undergo manual review to reduce annotat
|
||||
In addition to temperature measurements, the database includes contextual metadata such as age, height, weight, and optional user-entered markers.
|
||||
These markers provide further physiological context and may include information about intermediate bleeding, sexual intercourse, or positive pregnancy tests.
|
||||
|
||||
At the time of writing, the dataset contains approximately 65{,}000 annotated cycles, comprising more than 350 million individual temperature measurements.
|
||||
At the time of writing, the dataset contains approximately 65{,}000 annotated cycles,
|
||||
comprising more than 350 million individual temperature measurements~\footnote{This is the largest dataset of continuous body core temperature data used in any study so far.}.
|
||||
|
||||
\subsubsection{Dataset Summary}
|
||||
For the present study, the dataset was reduced to approximately 40{,}000 cycles after filtering out entries that were incomplete,
|
||||
contained hardware-related anomalies, or fell outside a reasonable cycle length range.
|
||||
|
||||
Very short cycles typically result from incorrect cycle start entries or premature termination of temperature recordings.
|
||||
Extremely long cycles are often due to data entry errors or pregnancy-related recordings,
|
||||
Cycles shorter than 10 days typically result from incorrect cycle start entries or premature termination of temperature recordings.
|
||||
Long cycles, longer than 150 days, are often due to data entry errors or pregnancy-related recordings,
|
||||
where the sensor was worn continuously throughout gestation—sometimes producing sequences up to nine months long.
|
||||
|
||||
While such cases may still contain useful information, they were excluded from this analysis to avoid complications in preprocessing and labeling.
|
||||
@@ -222,16 +207,18 @@ The median number of cycles per user is 4 (IQR: 2--8) and the median cycle lengt
|
||||
The average data density—defined as the fraction of available measurements out of the theoretical maximum of 288 measurements per day—is 0.90.
|
||||
This corresponds to an average data availability of 90\% per cycle, with an average loss of 10\%.
|
||||
|
||||
It should be noted, that both ovulation day and anovulation estimates are based on retrospective algorithmic inference, not human labels.
|
||||
Further details are provided in section~\ref{sec:methodology}.
|
||||
37934 cycles (94\%) were classified as biphasic and 2333 (6\%) as monophasic.
|
||||
|
||||
Users had a median age of 32 years (IQR: 29–36), median weight of 65 kg (IQR: 58–77), and median height of 168 cm (IQR: 163–172).
|
||||
|
||||
\subsubsection{Irregularities and Confounding Factors}
|
||||
Core body temperature is influenced by various factors unrelated to the menstrual cycle.
|
||||
Despite careful data collection, real-world measurements are subject to physiological and behavioral noise.
|
||||
Especially core body temperature is influenced by various factors unrelated to the menstrual cycle.
|
||||
Illnesses—especially those involving fever—can significantly affect temperature patterns.
|
||||
This poses a challenge for any analysis relying on temperature data, as one of the key physiological indicators of ovulation is a post-ovulatory temperature rise (see Section~\ref{subsubsec:physiological_signs}).
|
||||
|
||||
Figure~\ref{fig:background_fever_cycle} shows an example of a cycle where an illness caused a marked increase in temperature.
|
||||
This event is particularly problematic because the fever-induced rise occurs just before the expected ovulatory shift, potentially confounding ovulation detection.
|
||||
This event is particularly problematic because the fever-induced rise occurs just before the expected ovulatory shift, potentially confounding fertility detection.
|
||||
Distinguishing illness-related changes from cycle-related ones requires models that are sensitive to context and robust to outliers.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
@@ -254,39 +241,35 @@ Figure~\ref{fig:background_menstruation_data_gap} shows an example cycle with a
|
||||
\label{fig:background_menstruation_data_gap}
|
||||
\end{figure}
|
||||
|
||||
%TODO: more stats!
|
||||
|
||||
\subsubsection{Privacy}
|
||||
The dataset used in this study contains sensitive personal health information and is handled with strict privacy safeguards.
|
||||
All data is pseudonymized and processed exclusively on encrypted devices, ensuring that no identifiable information can be traced back to individual users.
|
||||
VivoSensMedical does not share user data with third parties; the data is used solely for internal research and product improvement efforts that directly benefit users at no additional cost.
|
||||
|
||||
\subsection{Technical Background}\label{subsec:technological_background}
|
||||
With a large, high-resolution dataset of longitudinal temperature measurements and associated metadata available,
|
||||
the next challenge lies in how to model such sequential data effectively.
|
||||
Accurate ovulation prediction requires algorithms that can handle temporal dependencies,
|
||||
irregularities, and physiological variability across users.
|
||||
To this end, we turn to machine learning techniques designed for time series analysis,
|
||||
beginning with foundational concepts and progressing to modern neural architectures.
|
||||
|
||||
\subsubsection{Time Series Analysis}\label{subsubsec:time_series_analysis}
|
||||
Time series analysis is a fundamental tool for studying sequential data that evolves over time.
|
||||
Unlike other data types, time series data has an inherent temporal order, where each data point is associated
|
||||
with a timestamp, capturing its dependence on past values.
|
||||
Time series analysis typically serves two main goals:
|
||||
Understanding the underlying mechanisms that lead to the observed data and predicting future data points based on the
|
||||
historical information and potentially external factors~\cite{cryer_time_2008}
|
||||
\\
|
||||
Time series analysis encompasses various methods, ranging from simple statistical models to complex deep learning architectures.
|
||||
Classical methods
|
||||
|
||||
|
||||
In the following, we will introduce the two most common approaches used for machine learning on time series data,
|
||||
LSTMs and transformers.
|
||||
Temperature data recorded by the OvulaRing forms a high-resolution time series, where each measurement carries temporal context.
|
||||
Time series analysis is essential to uncover meaningful patterns and predict future physiological states from such sequential data.
|
||||
In machine learning, this often involves models that can learn temporal dependencies—most notably
|
||||
Recurrent Neural Networks (RNNs) and the more recent Transformer architecture.
|
||||
|
||||
\subsubsection{RNN and LSTM Networks}\label{subsubsec:lstm_networks}
|
||||
Recurrent Neural Networks (RNNs) are extensions of classical neural networks that incorporate cyclic connections between neurons.
|
||||
These recurrent connections allow the network to retain information from previous inputs by feeding the hidden state
|
||||
from a prior time step into the current one, enabling a form of temporal memory.
|
||||
They process input \emph{sequentially}, maintaining this hidden state over time.
|
||||
|
||||
In practice, this means that input data is processed sequentially, one step at a time.
|
||||
At each step \(t\), the input \(x_t\) is combined with the previous hidden state \(h_{t-1}\) to produce a new
|
||||
hidden state \(h_t\), which contributes to the output \(o_t\).
|
||||
This process allows the network to learn temporal dependencies and model sequential data effectively~\cite{medsker_recurrent_1999}.
|
||||
This enables the network to learn temporal dependencies in sequential data~\cite{medsker_recurrent_1999}.
|
||||
|
||||
However, this approach has the downside that the model cannot explicitly control how it remembers or forgets information at each step,
|
||||
limiting its ability to manage long-term dependencies.
|
||||
@@ -366,7 +349,7 @@ as well as the biases for each gate in a cell, are learned through backpropagati
|
||||
To build more expressive models, memory cells can be stacked in multiple layers, and their outputs concatenated or passed sequentially to higher layers.
|
||||
|
||||
LSTMs are widely used in biomedical applications due to their capacity to handle sequences of variable length and complexity.
|
||||
In the context of ovulation prediction, where hormonal patterns exhibit periodicity but also irregularity,
|
||||
In the context of fertility prediction, where hormonal patterns exhibit periodicity but also irregularity,
|
||||
LSTMs are well-suited to learn relevant time-dependent signals from sequential physiological measurements.
|
||||
|
||||
While powerful, LSTMs can be computationally intensive and sensitive to hyperparameter tuning.
|
||||
@@ -374,16 +357,19 @@ Therefore, they are often compared with alternative architectures,
|
||||
including simpler feedforward networks and more recent attention-based models,
|
||||
to evaluate trade-offs in performance, interpretability, and computational cost.
|
||||
|
||||
The next section introduce the \emph{Transformer} architecture, a more recent alternative that forgoes
|
||||
Given their ability to learn from sequences with noisy periodic structure,
|
||||
LSTMs offer a natural choice for modeling hormonal and temperature fluctuations across menstrual cycles.
|
||||
|
||||
The next section introduces the \emph{Transformer} architecture, a more recent alternative that forgoes
|
||||
recurrence in favor of attention mechanisms.
|
||||
|
||||
\subsubsection{Transformer Models}\label{subsubsec:transformer_models}
|
||||
|
||||
Transformer models are a class of neural architectures that use \emph{self-attention}
|
||||
to model dependencies in sequential data without relying on recurrence~\cite{vaswani_attention_2017}.
|
||||
Unlike recurrent neural networks (RNNs), Transformers process input sequences in parallel,
|
||||
Unlike recurrent neural networks (RNNs), Transformers process input sequences \emph{in parallel},
|
||||
allowing them to model relationships between any pair of input tokens or timesteps directly.
|
||||
This mitigates the limitations of recurrent models, such as long-term memory constraints
|
||||
This design mitigates the limitations of recurrent models, such as long-term memory constraints
|
||||
and vanishing gradients.
|
||||
|
||||
Originally introduced for machine translation, Transformers have proven broadly applicable to
|
||||
@@ -423,13 +409,13 @@ to the model regardless of their location, even if they play different syntactic
|
||||
Positional encodings, often based on sinusoidal functions, inject a unique position-dependent signal
|
||||
into each token, enabling the model to distinguish between identical tokens in different positions.
|
||||
|
||||
In this work, we use since and cosine functions of different frequencies:
|
||||
In this work, we use sine and cosine functions of different frequencies:
|
||||
\begin{align}
|
||||
PE_{\text{pos}, 2i} &= \sin\left(\frac{\text{pos}}{10000^{\frac{2i}{d_{\text{model}}}}}\right), \\
|
||||
PE_{\text{pos}, 2i+1} &= \cos\left(\frac{\text{pos}}{10000^{\frac{2i}{d_{\text{model}}}}}\right)
|
||||
\end{align}
|
||||
where \(i\) is the dimension of the input and \(pos\) is the position in the sequence.
|
||||
This was done according to the original paper~\cite{vaswani_attention_2017}.
|
||||
where \(i\) is the dimension of the input and \(pos\) is the position in the sequence,
|
||||
as in the original paper~\cite{vaswani_attention_2017}.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
@@ -553,6 +539,9 @@ including time-series forecasting and biomedical modeling~\cite{wu_deep_nodate,z
|
||||
Its ability to model complex, long-range dependencies without recurrence makes it well-suited to domains like biomedical time-series,
|
||||
where signals are often irregular and span diverse temporal resolutions.
|
||||
|
||||
This makes Transformers well-suited for learning long-range temporal dependencies in physiological data,
|
||||
such as ovulatory trends spanning multiple days or cycles.
|
||||
|
||||
\subsubsection{Convolutional Layers as Temporal Feature Extractors}
|
||||
For high-resolution time-series data, the input dimensionality can become large,
|
||||
especially in models like Transformers that process the entire sequence in parallel.
|
||||
@@ -578,3 +567,7 @@ The stride determines how far the filter moves at each step, affecting both the
|
||||
\label{fig:background_convolution_example}
|
||||
\end{figure}
|
||||
|
||||
In summary, time-series modeling offers a range of approaches, each with specific trade-offs.
|
||||
RNNs and LSTMs provide explicit sequential modeling but suffer from training inefficiencies.
|
||||
Transformers excel at long-range context capture but demand more memory and parallelization.
|
||||
Convolutional layers offer efficient local feature extraction and often serve as useful pre-processing stages for both model families.
|
||||
@@ -1,8 +1,17 @@
|
||||
%! Author = alex
|
||||
%! Date = 3/6/25
|
||||
|
||||
|
||||
\section{Discussion}\label{sec:discussion}
|
||||
|
||||
In this study, we investigated the performance of different machine learning architectures on the task of fertility prediction,
|
||||
with the aim to find a model that performs well for natural family planning and natural contraception on regular and irregular cycles.
|
||||
|
||||
Our goal was to
|
||||
|
||||
Based on an extensive real-world database and established model architectures for timeseries analysis,
|
||||
we expect to outperform both rule-based baselines and related studies.
|
||||
We think, that for regular cycles, the performance difference will be lower than
|
||||
|
||||
|
||||
% talk about whether bbt / temperature can be used for such a task, discuss bbt doubt papers
|
||||
|
||||
@@ -3,48 +3,64 @@
|
||||
|
||||
|
||||
\section{Introduction}\label{sec:introduction}
|
||||
A 2024 report by McKinsey and the World Economic Forum\cite{mckinsey_health_institute_closing_2024} highlights
|
||||
persistent disparities in women's healthcare and health-related research, particularly in reproductive health.
|
||||
The Institute for Health Metrics and Evaluation (IHME) has identified reproductive and gynecological health issues as
|
||||
the most significant factors affecting both life span and health span globally\cite{global_burden_of_disease_collaborative_network_global_2020}.
|
||||
Despite their widespread impact, many aspects of reproductive health remain under-researched.
|
||||
Improving our ability to understand the menstrual cycle could have significant implications for fertility tracking, contraception,
|
||||
and overall reproductive health.
|
||||
\\
|
||||
\\
|
||||
|
||||
In textbooks, a menstrual cycle is 28 to 30 days in length with its ovulation happening around day 14~\cite{Phy}
|
||||
|
||||
|
||||
|
||||
The average age of pregnant women in developed countries has been increasing over the past few decades.
|
||||
This combined with the overall chance of conception sharply decreasing with age, especially after 35,
|
||||
makes it more and more important to understand and predict ovulation accurately\cite{sauer_reproduction_2015}.
|
||||
Combined with the sharp decline in conception rates after age 35,
|
||||
this trend underscores the growing need for accurate understanding of the menstrual cycle~\cite{sauer_reproduction_2015}.
|
||||
Predicting the fertile days in a women's menstrual cycle is not only relevant for family planning but also for
|
||||
natural contraception and general health monitoring, as the corresponding hormone levels have a significant impact on
|
||||
the overall health and well-being of a woman.
|
||||
\\
|
||||
Ovulation is the process in which an egg is released from the ovarian follicle, making fertilization possible.
|
||||
|
||||
Textbook cycles usually have a length of 28 days with an ovulation around day 14.
|
||||
This however, does not represent the real world variability of menstrual cycles.
|
||||
|
||||
Ovulation is the process in which an egg cell is released from the ovaries, making fertilization possible.
|
||||
This process is regulated by hormonal changes, including fluctuations in luteinizing hormone (LH) and
|
||||
follicle-stimulating hormone (FSH), and is accompanied by an increase in basal body temperature (BBT)\cite{holesh_physiology_2025}
|
||||
This process is complex and yet not fully understood.
|
||||
Factors such as stress, diet, and exercise can influence the menstrual cycle and make it hard to predict ovulation.
|
||||
\\
|
||||
\\
|
||||
Several physiological signs can be used to predict ovulation.
|
||||
The most accurate method is ultrasonography, which detects changes in follicle size and rupture.
|
||||
Other methods include detecting LH and FSH in urine, measuring BBT, and observing cervical mucus,
|
||||
each with its own advantages and limitations.
|
||||
These, as well as the interplay of those factors, will be discussed in more detail in Section~\ref{sec:background}.
|
||||
follicle-stimulating hormone (FSH), and is accompanied by other physiological changes such as an increase in electrical resistance
|
||||
and viscosity of the cervical mucus or an increase in body temperature~\cite{wallach_prediction_1980}.
|
||||
These processes remain incompletely understood and are influenced by lifestyle factors such as stress, diet or exercise or
|
||||
health-related factors such as Polycystic Ovary Syndrome (PCOS), making ovulation difficult to predict.
|
||||
|
||||
Many studies have used these physiological signs to predict ovulation and fertility
|
||||
\cite{noauthor_cervicovaginal_2005, sato_novel_2024, royston_identifying_1991, luo_detection_2020,
|
||||
alexander_fertilitatsmonitoring_2014, luz_improved_2024, yu_tracking_2022, pratikno_pdf_2024}.
|
||||
However, most of these methods rely on manual data collection, requiring either daily measurements or invasive procedures.
|
||||
This not only makes them impractical but also results in small sample sizes, limiting their generalizability.
|
||||
In theory, these physiological changes provide a basis for predicting ovulation and the surrounding fertile window.
|
||||
In practice, however, many of these signals are difficult to measure continuously, as they require invasive procedures,
|
||||
manual tracking, or costly equipment.
|
||||
Body temperature, by contrast, is a non-invasive marker that can be measured continuously using intravaginal, wrist-worn, or ear-worn thermometers.
|
||||
While some studies have deemed body temperature unusable for predictive analysis~\cite{bauman_basal_1981},
|
||||
others suggest its predictive value for ovulation~\cite{sato_novel_2024, royston_identifying_1991,
|
||||
luo_detection_2020, alexander_fertilitatsmonitoring_2014, luz_improved_2024, yu_tracking_2022, pratikno_pdf_2024}.
|
||||
|
||||
Generalization is crucial for developing a reliable ovulation predictor, given the high variability of the menstrual cycle
|
||||
\cite{munster_length_1992, bull_real-world_2019}.
|
||||
This is particularly important for applications where prediction accuracy
|
||||
is critical, such as natural contraception or high-cost procedures like in-vitro fertilization (IVF),
|
||||
where false predictions can have severe consequences.
|
||||
However, most existing studies rely on small, idealized datasets that exclude cycles with irregular lengths or late ovulation.
|
||||
While such restrictions simplify the prediction task and yield high accuracy, they give a misleading impression of real-world model performance.
|
||||
It is thus not yet fully clear, whether temperature can reliably be used as a predictive marker for ovulation or fertility.
|
||||
|
||||
This work aims to develop an ovulation predictor that is both accurate and generalizable while maintaining interpretability,
|
||||
allowing for insights into key variables and patterns influencing the prediction.
|
||||
Additionally, other studies have focused on peripheral temperature measurements of skin or in-ear temperature,
|
||||
which are subject to many sources of noise that can significantly affect the quality of the resulting predictions.
|
||||
Intravaginal temperature reflects true core body temperature and offers higher resolution and stability,
|
||||
as it is largely unaffected by external circumstances.
|
||||
This allows for more reliable detection of subtle thermal shifts associated with ovulation, especially in irregular cycles.
|
||||
|
||||
% research questions
|
||||
Generalization is critical for reliable ovulation prediction,
|
||||
especially given the high variability in cycle patterns~\cite{munster_length_1992, bull_real-world_2019}.
|
||||
This is particularly relevant in high-stakes applications such as natural contraception or in-vitro fertilization (IVF),
|
||||
where inaccurate predictions can have serious consequences.
|
||||
|
||||
|
||||
This study aims to advance ovulation prediction by leveraging an extensive database of more than 40,000 menstrual cycles recorded using
|
||||
an intravaginal wearable device that continuously measures core body temperature.
|
||||
The objective is to develop a machine learning model that performs reliably across diverse cycle types, including irregular ones.
|
||||
To this end, we compare a set of time series-based machine learning architectures and evaluate their performance for
|
||||
natural family planning and contraception.
|
||||
Finally, we demonstrate that high predictive accuracy on highly regular, curated datasets, as commonly reported in prior work,
|
||||
does not reflect general applicability, since such datasets tend to favor even simple, rule-based approaches.
|
||||
|
||||
|
||||
The research objectives are:
|
||||
\begin{itemize}
|
||||
\item To assess the performance of different model architectures on the use cases of natural family planning and contraception, across both regular and irregular cycles.
|
||||
\item To compare sophisticated machine learning models with simple rule-based baseline approaches.
|
||||
\item To study the overall predictive quality of temperature for ovulation and fertility prediction.
|
||||
\end{itemize}
|
||||
|
||||
@@ -4,22 +4,18 @@
|
||||
|
||||
\section{Methodology}\label{sec:methodology}
|
||||
|
||||
While prior studies have demonstrated the promise of physiological signals for ovulation detection and phase classification,
|
||||
many are limited by small sample sizes, rigid inclusion criteria, or non-transparent methodologies.
|
||||
Temperature has emerged as a potentially predictive signal, but existing work often lacks scalability or generalizability.
|
||||
This study extends previous approaches by leveraging a large, heterogeneous real-world dataset of high-resolution core body temperature
|
||||
readings to develop and evaluate machine learning models for real-time ovulation prediction.
|
||||
In addition to model development, special emphasis is placed on evaluating performance across irregular cycles and assessing
|
||||
the predictive value of low-noise, high-resolution temperature data.
|
||||
|
||||
The following section outlines the methodology used, including data preprocessing,
|
||||
feature extraction, input encoding, and model architectures.
|
||||
|
||||
% why did I select tft over other methods -> include examples of time series and why I belief a complex model could help
|
||||
% you did I apply it
|
||||
% implementation details
|
||||
Despite promising results in earlier studies, ovulation prediction remains constrained by small datasets,
|
||||
assumptions of cycle regularity, and opaque modeling approaches.
|
||||
To address these limitations, we develop a data-driven framework based on a large,
|
||||
heterogeneous dataset of real-world menstrual cycles.
|
||||
Our approach emphasizes model transparency, adaptability to irregular patterns, and the predictive utility of
|
||||
high-resolution core body temperature measurements.
|
||||
This section outlines the methodology used, including preprocessing, labeling, feature extraction, and model architectures.
|
||||
|
||||
\subsection{Data Preprocessing}\label{subsec:data_preprocessing}
|
||||
This section outlines the preprocessing steps applied to the raw temperature data,
|
||||
including cycle filtering and retrospective ovulation labeling.
|
||||
These steps ensure that only clean, complete, and labeled cycles are used for model training.
|
||||
|
||||
\subsubsection{Data Filtering}\label{subsubsec:data_filtering}
|
||||
|
||||
@@ -53,15 +49,15 @@ The algorithm operates in two stages:
|
||||
\end{enumerate}
|
||||
|
||||
This retrospective labeling provides a practical and scalable proxy for ground truth, enabling training and evaluation across a large, real-world dataset,
|
||||
especially, as temperature is at least an excellent retrospective marker for ovulation.
|
||||
particularly given that temperature is a well-established retrospective marker of ovulation.
|
||||
In internal evaluations, the estimated ovulation day fell within a \(\pm\)2-day window of the expert reference in approximately 86\% of labeled cycles.
|
||||
|
||||
These labels serve as the supervisory signal for model training and evaluation.
|
||||
We acknowledge the limitations of this method: ambiguous or noisy temperature patterns—due to illness, dropout,
|
||||
or sensor error—can lead to mislabeled examples, which may propagate to downstream models.
|
||||
We acknowledge the limitations of this method: ambiguous or noisy temperature patterns, due to illness, dropout,
|
||||
or sensor error, may result in noisy labels, which can affect downstream model performance.
|
||||
However, label quality is continuously reviewed and may be refined iteratively as model performance improves.
|
||||
|
||||
The specific usage of ovulation labels in feature construction is described in the next section.
|
||||
The next section details how these labels are incorporated into feature representations and model training.
|
||||
|
||||
\subsection{Feature Engineering}\label{subsec:feature_engineering}
|
||||
|
||||
@@ -70,8 +66,8 @@ The features used as model inputs have been divided into three categories:
|
||||
\item \textbf{Static features} - Characteristics, that remain constant across a user's cycle, such as age, height, or average ovulation day
|
||||
\item \textbf{Known features} — Inputs known a priori at each time step, such as time of day or calendar-based variables.
|
||||
\item \textbf{Observable features} — Inputs available at the current time step, including raw and derived temperature values.
|
||||
\item \textbf{Target features} — Outputs the model is trained to predict, such as the fertility probability.
|
||||
\end{itemize}
|
||||
The target variables predicted by the model—like ovulation status or fertility probability—are described separately.
|
||||
|
||||
Each feature type can handle categorical and continuous features.
|
||||
This allows for mixed inputs, such as scalar measurements and class labels, within the same category.
|
||||
@@ -84,48 +80,44 @@ may process each feature group differently depending on their architectural desi
|
||||
|
||||
Static features are the features that do not change over the course of a cycle.
|
||||
They might even be static for all cycles from a specific user, such as age, height and weight.
|
||||
Static features provide user-specific context that helps the model learn individualized cycle patterns beyond what temperature alone can reveal.
|
||||
|
||||
The static features are supposed to create contextual information about the cycle and the user that each model can then
|
||||
use to learn patterns based not only on the temperature data, but also on this context.
|
||||
%\begin{table}[htbp]
|
||||
% \centering
|
||||
% \begin{tabular}{l>{\raggedright\arraybackslash}p{0.65\linewidth}}
|
||||
% \toprule
|
||||
% \textbf{Feature} & \textbf{Description} \\
|
||||
% \midrule
|
||||
% User age & Age in years; mean imputed if missing \\
|
||||
% User height & Height in centimeters; mean imputed if missing \\
|
||||
% User weight & Weight in kilograms; mean imputed if missing \\
|
||||
% Average cycle length & Mean length of all previous cycles for this user \\
|
||||
% Cycle length SD & Standard deviation of previous cycle lengths \\
|
||||
% Average ovulation day & Mean day of ovulation from previous cycles \\
|
||||
% Ovulation SD & Standard deviation of ovulation day of previous cycles \\
|
||||
% Ovulatory fraction & Proportion of prior cycles classified as ovulatory \\
|
||||
% Cycle count & Number of previous completed cycles available \\
|
||||
% Avg. pre-ovulation temperature & Mean temperature in the follicular phase of previous cycles \\
|
||||
% Avg. post-ovulation temperature & Mean temperature in the luteal phase of previous cycles \\
|
||||
% \bottomrule
|
||||
% \end{tabular}
|
||||
% \caption{Static features used as model inputs}
|
||||
% \label{tab:static_features}
|
||||
%\end{table}
|
||||
%Table~\ref{tab:static_features} shows all static features and their descriptions.
|
||||
|
||||
\begin{table}[htbp]
|
||||
\centering
|
||||
\begin{tabular}{l>{\raggedright\arraybackslash}p{0.65\linewidth}}
|
||||
\toprule
|
||||
\textbf{Feature} & \textbf{Description} \\
|
||||
\midrule
|
||||
User age & Age in years; mean imputed if missing \\
|
||||
User height & Height in centimeters; mean imputed if missing \\
|
||||
User weight & Weight in kilograms; mean imputed if missing \\
|
||||
Average cycle length & Mean length of all previous cycles for this user \\
|
||||
Cycle length SD & Standard deviation of previous cycle lengths \\
|
||||
Average ovulation day & Mean day of ovulation from previous cycles \\
|
||||
Ovulation SD & Standard deviation of ovulation day of previous cycles \\
|
||||
Ovulatory fraction & Proportion of prior cycles classified as ovulatory \\
|
||||
Cycle count & Number of previous completed cycles available \\
|
||||
Avg. pre-ovulation temperature & Mean temperature in the follicular phase of previous cycles \\
|
||||
Avg. post-ovulation temperature & Mean temperature in the luteal phase of previous cycles \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\caption{Static features used as model inputs}
|
||||
\label{tab:static_features}
|
||||
\end{table}
|
||||
|
||||
Table~\ref{tab:static_features} shows all static features and their descriptions.
|
||||
Prior research by \citeauthor{li_menstrual_2023} has shown that menstrual cycle characteristics vary significantly with age and BMI~\cite{li_menstrual_2023}.
|
||||
Including such information is therefore expected to improve predictive performance.
|
||||
|
||||
In addition, summary statistics from previous cycles—such as ovulation timing, temperature levels, or the fraction of ovulatory cycles—provide useful individual context.
|
||||
These features help the model learn subject-specific variability and better estimate the likelihood and timing of ovulation in the current cycle.
|
||||
Table~\ref{tab:feature_overview} shows the full list of static input features.
|
||||
|
||||
All historical features are computed using only data available prior to the current cycle, ensuring no data leakage and supporting robust, user-adaptive learning.
|
||||
|
||||
%
|
||||
The idea here is to provide as much context information to the models as possible to help them predict the ovulation.
|
||||
|
||||
\subsubsection{Known Features}\label{subsubsec:known_features}
|
||||
In the context of this study, known features correspond to time-dependent inputs.
|
||||
These help the model place each observation in temporal context:
|
||||
Known features encode temporal context that is available at each time step and independent of physiological measurements.
|
||||
These help the model interpret observations in relation to time-based structure, including circadian and behavioral rhythms.
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Time since cycle start} — Provides the model with a relative position within the menstrual cycle.
|
||||
@@ -172,11 +164,9 @@ They represent real-time physiological signals from which the model must infer o
|
||||
\item \textbf{Rolling Window Temperature Maximum} — The maximum temperature within a 1-day window, capturing transient peaks or elevated plateaus.
|
||||
\end{itemize}
|
||||
|
||||
These derived features are intended to reduce model complexity by providing smoothed or extremal summaries of the raw signal.
|
||||
The \textit{rolling average} allows the model to capture broader trends without having to learn temporal aggregation from scratch.
|
||||
The \textit{rolling minimum} and \textit{maximum} support the detection of boundary behavior (e.g., temperature shifts, sustained elevation, extreme values)
|
||||
without requiring explicit memory or aggregation.
|
||||
These derived features summarize local trends or extrema in the temperature signal, reducing the burden on the model to learn such patterns from raw data.
|
||||
Special care was taken, so that the sliding window can only look backwards, so that no data leakage can happen.
|
||||
We extend each windowed feature at the beginning with the starting value, so that the window can be calculated for the first real value already.
|
||||
The 1-day window length reflects the expected circadian cycle and strikes a balance between temporal sensitivity and signal stability.
|
||||
|
||||
Figure~\ref{fig:methodology_observable_features} illustrates the behavior of all observable features within a single cycle.
|
||||
@@ -260,7 +250,8 @@ a \textit{robust scaler} was used for distributions with outliers, and a \textit
|
||||
\subsubsection{Time-Series Input Representation}
|
||||
\label{subsubsec:time_series_input_representation}
|
||||
|
||||
Due to the high temporal resolution of the temperature data (288 measurements per day), raw input sequences can become prohibitively long for most model types.
|
||||
The high temporal resolution of the temperature data, 288 measurements per day, results in very long input sequences
|
||||
that are impractical for most deep learning models to process directly.
|
||||
|
||||
To manage input size and evaluate the impact of temporal resolution on predictive performance, a parameterized resampling strategy is applied.
|
||||
Consecutive time steps are aggregated into bins of configurable size, and each bin is reduced to a single value using a feature-specific aggregation function.
|
||||
@@ -274,17 +265,17 @@ The effect of different sampling resolutions and aggregation strategies is evalu
|
||||
To simulate real-time prediction rather than retrospective analysis, a sliding-window approach is employed.
|
||||
This allows the model to make predictions based only on data available up to a specific point in the cycle.
|
||||
|
||||
Each cycle is split into overlapping input windows, where each window includes data from the cycle start up to a defined time step.
|
||||
The window length is fixed and configurable.
|
||||
As the cycle progresses, the window slides forward, allowing the model to incorporate increasing historical context over time.
|
||||
To simulate real-time prediction, each cycle is split into overlapping,
|
||||
fixed-length input windows that capture all available data up to a given time step.
|
||||
As the cycle progresses, these windows slide forward, allowing the model to update its prediction based on growing historical context.
|
||||
|
||||
For the model types used in this study, each window produces a single output vector.
|
||||
By default, this corresponds to the predicted target values at the final time step of the window, though this can be offset depending on configuration.
|
||||
By default, this corresponds to the predicted target values at the final time step of the window,
|
||||
though this can be offset to predict targets several steps into the future, depending on configuration.
|
||||
While the architecture could be extended to produce output sequences (e.g., one prediction per input step), this study focuses on single-vector outputs.
|
||||
|
||||
This setup enables temporally resolved predictions at different stages of the cycle and supports analysis of how predictive accuracy evolves with increasing context.
|
||||
Depending on the configuration, downsampling and windowing can be skipped to allow the raw data to be processed by the models themselves.
|
||||
This is used primarily in the convolutional flavours of the models, to allow them to learn the best way of reducing the input complexity based on the data itself.
|
||||
This setup mimics a real-time setting, enabling the model to generate predictions dynamically as new data arrives during the cycle.
|
||||
For convolutional architectures, downsampling and windowing can be disabled entirely, allowing the model to learn temporal compression directly from the raw input.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
@@ -296,18 +287,16 @@ This is used primarily in the convolutional flavours of the models, to allow the
|
||||
\label{fig:methodology_padding_example}
|
||||
\end{figure}
|
||||
|
||||
Fixed-length input windows would normally prevent early-cycle predictions when insufficient data is available.
|
||||
To address this, left-padding is applied using masked values.
|
||||
|
||||
In this study, predictions are enabled once at least four days of data are available.
|
||||
A padding value of 0.0 is used for all features, and the padding length is adjusted accordingly.
|
||||
This design ensures that the model learns to ignore tokens consisting entirely of padding.
|
||||
|
||||
The feature \textit{hours since start}, which encodes the time elapsed since cycle onset, is also set to 0.0 for all padded tokens—
|
||||
explicitly indicating that these entries contain no usable information.
|
||||
Because fixed-length windows require a minimum amount of input data, early-cycle predictions would normally be impossible.
|
||||
To address this, left-padding is applied with masked tokens until sufficient real data is available—enabled here from day four onward.
|
||||
Padding values are set to 0.0 across all features.
|
||||
Since the feature \emph{hours since start} is also set to 0.0 for padded steps it is reinforced, that the section is not relevant
|
||||
for the prediction as no information is present.
|
||||
|
||||
Figure~\ref{fig:methodology_padding_example} shows an example of such padding during early-cycle input preparation.
|
||||
|
||||
This input strategy supports efficient, temporally-aware learning and allows us to evaluate how predictive accuracy evolves over time within each cycle.
|
||||
|
||||
\subsection{Model Architecture and Selection}\label{subsec:model_architecture_and_selection}
|
||||
|
||||
The primary objective of this study is to find models that accurately predict the features introduced in~\ref{fig:methodology_target_features},
|
||||
@@ -565,11 +554,9 @@ Due to the heterogeneity of both the models and the trainings, a dynamic batch s
|
||||
the batch size dynamically during training to optimize the resource usage.
|
||||
The learning rate was scaled linearly with the batch size to allow for equivalent convergence behaviour~\cite{goyal_accurate_2018}
|
||||
The batch size was capped at 2048 to avoid OOM errors during data preparation.
|
||||
%TODO sources, for square rule
|
||||
|
||||
\subsection{Evaluation}\label{subsec:evaluation}
|
||||
|
||||
% TODO: review
|
||||
To meaningfully compare model performance, we define a set of metrics that capture both overall accuracy and behavior at key points in the prediction sequence.
|
||||
This includes metrics for different temporal segments, enabling a more detailed understanding of model strengths and limitations.
|
||||
|
||||
@@ -698,7 +685,7 @@ Additionally, ovulation must occur no later than cycle day 150, as later values
|
||||
biologically atypical cases that fall outside the scope of this study.
|
||||
|
||||
\subsubsection{Use Case Evaluation}
|
||||
We further evaluate the two distinct use cases introduced in Section~\ref{subsubsec:use_cases_of_ovulation_prediction}.
|
||||
We further evaluate the two distinct use cases introduced in Section~\ref{subsubsec:practical_use_cases}.
|
||||
For this purpose, two specialized evaluation algorithms were developed,
|
||||
enabling comparability between models and providing interpretable performance metrics for each scenario.
|
||||
|
||||
@@ -721,9 +708,11 @@ A day-specific probability of intercourse is computed for each user based on age
|
||||
We assume, that the users don't have any health-related or non-health-related issues affecting fertility.
|
||||
If a user's age is unknown, it is randomly drawn from the overall dataset distribution.
|
||||
Only users with at least one continuous year of data are included.
|
||||
To get a representative result, we use 500 randomly selected user years.
|
||||
|
||||
Each day of data for a full year is categorized by the algorithm into one of the following outcomes:
|
||||
Each day of data for a full year we count the following states by the algorithm:
|
||||
\begin{itemize}
|
||||
\item \emph{Sex}: Intercourse occurred.
|
||||
\item \emph{No Sex}: no intercourse occurred.
|
||||
\item \emph{Correct Denial}: fertility prediction correctly indicated abstinence during a fertile period.
|
||||
\item \emph{Incorrect Denial}: fertility prediction incorrectly indicated abstinence during an infertile period.
|
||||
@@ -753,16 +742,16 @@ Figure~\ref{fig:methodology_use_case_pregnancy_decision_diagram} illustrates the
|
||||
The fertility threshold is adjustable and is explored further in Section~\ref{subsec:use_case_evaluation_results}.
|
||||
Since sexual intercourse frequency differs slightly for couples trying to conceive~\cite{gaskins_predictors_2018},
|
||||
we assume an average frequency of six times per month.
|
||||
We derive a daily probability of intercourse based on remaining fertile days predicted for the month,
|
||||
ensuring that intercourse frequency averages out to this monthly rate.
|
||||
|
||||
We assume no health-related fertility impairments for comparative simplicity,
|
||||
though we acknowledge that real-world fertility is influenced by numerous complex factors.
|
||||
Similar to the contraception scenario, only users with at least one continuous year of data are considered.
|
||||
For representative results, we use 500 randomly selected user years.
|
||||
|
||||
Each day in a full year is classified into one of the following categories:
|
||||
For each day in a full year we count occurrences of the following states:
|
||||
\begin{itemize}
|
||||
\item \emph{No Sex}: Day predicted as fertile, but no intercourse occurred.
|
||||
\item \emph{Sex}: Intercourse occurred
|
||||
\item \emph{No Sex}: No intercourse
|
||||
\item \emph{Pregnancy}: Correct fertile prediction, intercourse occurred, resulting in pregnancy.
|
||||
\item \emph{No Pregnancy}: Correct fertile prediction, intercourse occurred, but no pregnancy occurred.
|
||||
\item \emph{Incorrect Deferral}: Incorrect non-fertile prediction, actual fertility was above threshold.
|
||||
|
||||
@@ -16,6 +16,8 @@ confirming that LH surges reliably indicate an imminent ovulation event.
|
||||
|
||||
Despite their diagnostic value, many of these biomarkers are difficult to measure continuously and reliably in everyday settings,
|
||||
limiting their practicality for real-time or large-scale applications.
|
||||
Among the physiological indicators explored, body temperature has gained particular attention due to its accessibility
|
||||
and suitability for passive, continuous monitoring.
|
||||
|
||||
\subsection{Temperature-Based Approaches}\label{subsec:temperature_based_approaches}
|
||||
Body temperature has emerged as a more accessible physiological signal for ovulation tracking,
|
||||
@@ -34,7 +36,7 @@ In contrast, this study, along with several recent works, leverages continuous o
|
||||
This richer signal provides a more robust foundation for detecting ovulatory patterns and addresses many of the limitations historically associated with BBT-based methods.
|
||||
|
||||
This was further supported by a study from \citeauthor{zhu_accuracy_2021}, who compared the accuracy and sensitivity of traditional BBT measurements with continuous skin temperature recordings from a wrist-worn device~\cite{zhu_accuracy_2021}.
|
||||
They found that continuous temperature measurements had significantly higher sensitivity in detecting ovulation, though at the cost of increased false positives and lower specificity.
|
||||
They found that continuous temperature measurements achieved higher sensitivity but at the cost of more false positives and reduced specificity.
|
||||
Importantly, the continuous data showed a greater average temperature difference between the follicular and luteal phases.
|
||||
The authors conclude that for women seeking to optimize their chances of conception, continuous temperature tracking offers measurable benefits—primarily due to improved phase delineation enabled by the richer signal.
|
||||
|
||||
@@ -43,33 +45,34 @@ who used an in-ear wearable device that measured ear canal temperature every fiv
|
||||
They trained a Hidden Markov Model (HMM) to classify each data point into either a high- or low-temperature state,
|
||||
augmented with biorhythm information from the user.
|
||||
|
||||
After filtering, the final dataset consisted of 65 cycles, each with at least 40\% data availability and at least one self-reported ovulation day, as determined by a hormone test kit.
|
||||
After filtering, the final dataset consisted of 65 cycles, each with at least 40\% data availability and at least one self-reported ovulation day, as determined by a hormone test kit,
|
||||
a notable contrast to the 40,000 cycles analyzed in this study.
|
||||
However, no information was provided regarding the distribution of cycle lengths or ovulation timing.
|
||||
|
||||
Ovulation detection was considered successful if the predicted day fell within ±3 days of the self-reported value.
|
||||
The method achieved a sensitivity of 92.31\%, with 54.69\% of ovulation days detected exactly on the reported date.
|
||||
|
||||
The model, however, relies on strong assumptions of phase regularity and fixed transition durations—such as a standard
|
||||
luteal phase length of 14 days—which do not reflect real-world variability.
|
||||
The model, however, relies on strong assumptions of phase regularity and fixed transition durations, such as a standard
|
||||
luteal phase length of 14 days, which do not reflect real-world variability.
|
||||
Moreover, HMM predictions are conditioned on either a previous cycle or population-level averages, limiting performance in irregular or anovulatory cycles.
|
||||
As a result, the approach performs well on regular, well-behaved data but lacks robustness in more diverse, real-world scenarios.
|
||||
|
||||
|
||||
In~\citeyear{yu_tracking_2022}, \citeauthor{yu_tracking_2022} employed an in-ear thermometer along with a fitness tracker
|
||||
Building on this idea, \citeauthor{yu_tracking_2022} combined temperature with additional physiological signals to improve predictive performance.
|
||||
In~\citeyear{yu_tracking_2022}, they employed an in-ear thermometer along with a fitness tracker
|
||||
for heart rate monitoring to predict the fertile window using machine learning~\cite{yu_tracking_2022}.
|
||||
Their study population consisted of 153 women, divided into a regular cycle group ($n = 103$) and an irregular group ($n = 50$).
|
||||
After filtering, 89 and 25 participants remained in the regular and irregular groups, respectively.
|
||||
|
||||
The prediction task was to determine whether a given day falls within the fertile window, based on data from the preceding days.
|
||||
A second model was trained to predict whether menstruation occurs on a given day, again using preceding data as input.
|
||||
They developed a probability function based on a changepoint analysis of the smoothed waveforms of the BBT and heart rate.
|
||||
A second function was developed in a similar way to predict whether menstruation occurs on a given day, again using preceding data as input.
|
||||
|
||||
For the fertile window prediction, the model achieved a sensitivity of 69.30\% in the regular group and 21.00\% in the irregular group.
|
||||
For menstruation prediction, the model detected 70.70\% of menstruation days in the regular group and 36.30\% in the irregular group.
|
||||
|
||||
These results indicate that the model performs reasonably well for individuals with regular cycles,
|
||||
but struggles significantly in the presence of menstrual irregularity—particularly in detecting the fertile window.
|
||||
These results indicate that the model performed well in regular cycles but struggled with irregularity, particularly in detecting the fertile window.
|
||||
|
||||
In addition to academic research, several commercial products use temperature-based methods for fertility tracking,
|
||||
Complementing academic efforts, several commercial products have adopted temperature-based tracking,
|
||||
such as \textit{Ava}~\cite{sl_ava_nodate}, \textit{Daysy}~\cite{electronics_zykluscomputer_nodate} or \textit{Trackle}~\cite{noauthor_trackle_nodate}.
|
||||
However, these products typically rely on proprietary algorithms, and no peer-reviewed publications are available detailing their methodology or performance.
|
||||
This lack of transparency limits their scientific evaluation and comparability.
|
||||
@@ -109,17 +112,15 @@ Anovulatory cycles were excluded, along with users meeting the following criteri
|
||||
They further subdivided participants into groups with low and high sleep variability, called HVST and LVST respectively.
|
||||
As a result, the study population and cycle types were highly regular and homogeneous,
|
||||
with 30 cycles (18 women) in the HVST and 26 cycles (16 women) in the LVST category.
|
||||
No information about the distribution of both lengths or ovulation dates was given.
|
||||
No information about the distribution of both cycle lengths or ovulation dates was given.
|
||||
|
||||
Based on selected features—such as minimum sleeping heart rate and single-point basal body temperature (BBT) after
|
||||
waking—they report classification accuracies between 0.843 and 0.864, depending on the feature subset,
|
||||
with very similar numbers for precision, recall, specificity and F1 score.
|
||||
Ovulation day prediction yielded an average absolute error between 3.6 and 4.1 days.
|
||||
|
||||
|
||||
|
||||
\paragraph{Summary:}
|
||||
While various physiological signals and modeling strategies have been explored for ovulation prediction,
|
||||
many existing studies are limited by small, highly selected datasets, assumptions of cycle regularity, or reliance on proprietary algorithms.
|
||||
many existing studies are limited by small, highly selective datasets, assumptions of cycle regularity, or reliance on proprietary algorithms.
|
||||
The present work extends prior approaches by leveraging a large, heterogeneous dataset of real-world cycles and applying transparent,
|
||||
data-driven modeling to better capture individual variability.
|
||||
@@ -25,6 +25,32 @@ allowing for a nuanced comparison of approaches and their practical relevance to
|
||||
|
||||
\subsection{Fertility Probability Prediction Accuracy}\label{subsec:fertility_probability_precition_accuracy}
|
||||
|
||||
\begin{landscape}
|
||||
\begin{table}[ht]
|
||||
\centering
|
||||
\caption{Model comparison for fertility prediction using MAE and MSE}
|
||||
\begin{adjustbox}{max width=\linewidth}
|
||||
\begin{tabular}{lllcccccc}
|
||||
\toprule
|
||||
\textbf{Model} & \textbf{Window} & \textbf{Daily} &
|
||||
\textbf{MAE$_{fert}$} & \textbf{MAE$_{fert,during}$} & \textbf{MAE$_{fert,non}$} &
|
||||
\textbf{MSE$_{fert}$} & \textbf{MSE$_{fert,during}$} & \textbf{MSE$_{fert,non}$} \\
|
||||
\midrule
|
||||
ModelA & 7 & Yes & 0.67 & 0.59 & 0.73 & 0.89 & 0.82 & 0.95 \\
|
||||
ModelB & 14 & No & 0.65 & 0.58 & 0.71 & 0.87 & 0.80 & 0.93 \\
|
||||
% More rows...
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{adjustbox}
|
||||
\label{tab:fertility_comparison}
|
||||
\end{table}
|
||||
\end{landscape}
|
||||
|
||||
|
||||
|
||||
% show why I selected the individual input configs for model config training
|
||||
% selected by best mse fertility, use 2nd best, as it provides basically the same performance, but more input data for more complex model configs
|
||||
|
||||
\subsubsection{Performance Across Fertile Window}\label{subsubsec:fert_performance_across_fertile_window}
|
||||
|
||||
\subsubsection{Impact of Input Resolution}\label{subsubsec:fert_impact_of_input_resolution}
|
||||
@@ -56,6 +82,4 @@ allowing for a nuanced comparison of approaches and their practical relevance to
|
||||
\subsubsection{Pregnancy Use-Case Results}\label{subsubsec:use_case_pregnancy_results}
|
||||
|
||||
|
||||
% show, that past cycles might not directly be included but are indirectly included by the static features
|
||||
|
||||
\subsection{Summary of Key Findings}\label{subsec:summary_of_key_findings}
|
||||
|
||||