further work on introduction

This commit is contained in:
Alex Blank
2025-08-04 15:05:48 +00:00
parent 18c4f3eba9
commit b63dcfcc9b
14 changed files with 2377 additions and 2441 deletions
+1982 -2122
View File
File diff suppressed because one or more lines are too long
+4 -2
View File
@@ -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{Masters 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 OpenAIs ChatGPT .
Binary file not shown.

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&lt;div&gt;have&lt;/div&gt;&lt;div&gt;Sex?&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxCell id="-91SqtgMbv2aO-WyCwji-5" value="Would&lt;div&gt;have&lt;/div&gt;&lt;div&gt;Sex?&lt;/div&gt;" 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 &amp;gt; Threshold" style="rhombus;whiteSpace=wrap;html=1;spacingTop=11;" vertex="1" parent="1">
<mxCell id="-91SqtgMbv2aO-WyCwji-18" value="Predicted Fertiltiy &amp;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="&lt;font color=&quot;#121212&quot;&gt;&lt;span&gt;No Sex&lt;/span&gt;&lt;/font&gt;" 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="&lt;font color=&quot;#121212&quot;&gt;&lt;span&gt;No Sex&lt;/span&gt;&lt;/font&gt;" 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="&lt;font style=&quot;font-size: 16px;&quot;&gt;Yes&lt;/font&gt;" 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="&lt;font style=&quot;font-size: 16px;&quot;&gt;Yes&lt;/font&gt;" 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 &amp;lt; Threshold" style="rhombus;whiteSpace=wrap;html=1;spacingTop=8;" vertex="1" parent="1">
<mxCell id="-91SqtgMbv2aO-WyCwji-31" value="Actual Fertility &amp;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 &amp;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 &amp;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 &amp;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 &amp;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="&lt;span style=&quot;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;&quot;&gt;Actual Fertility as&amp;nbsp;&lt;/span&gt;&lt;div style=&quot;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;&quot;&gt;Probability P&lt;/div&gt;" 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="&lt;span style=&quot;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;&quot;&gt;Actual Fertility as&amp;nbsp;&lt;/span&gt;&lt;div style=&quot;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;&quot;&gt;Probability P&lt;/div&gt;" 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="&lt;div&gt;&lt;span style=&quot;color: light-dark(rgb(18, 18, 18), rgb(222, 222, 222)); background-color: transparent;&quot;&gt;Sex&lt;/span&gt;&lt;/div&gt;" 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="&lt;font style=&quot;font-size: 16px;&quot;&gt;Yes&lt;/font&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WKEbJVpTUuC8SgsnX6qr-19">
<mxCell id="WKEbJVpTUuC8SgsnX6qr-31" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;Yes&lt;/font&gt;" 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 &amp;gt; Threshold" style="rhombus;whiteSpace=wrap;html=1;spacingTop=9;" vertex="1" parent="1">
<mxCell id="WKEbJVpTUuC8SgsnX6qr-2" value="Predicted Fertility &amp;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 &amp;gt;&lt;div&gt;Threshold&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxCell id="WKEbJVpTUuC8SgsnX6qr-4" value="Actual Fertility &amp;gt;&lt;div&gt;Threshold&lt;/div&gt;" 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 &amp;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 &amp;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 &amp;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 &amp;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="&lt;span style=&quot;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;&quot;&gt;Actual Fertility as&amp;nbsp;&lt;/span&gt;&lt;div style=&quot;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;&quot;&gt;Probability P&lt;/div&gt;" 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="&lt;span style=&quot;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;&quot;&gt;Actual Fertility as&amp;nbsp;&lt;/span&gt;&lt;div style=&quot;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;&quot;&gt;Probability P&lt;/div&gt;" 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 &amp;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 &amp;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 &amp;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 &amp;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&amp;nbsp;&lt;div&gt;Probability as P&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;spacingTop=-1;" vertex="1" parent="1">
<mxCell id="WKEbJVpTUuC8SgsnX6qr-18" value="Intercourse&amp;nbsp;&lt;div&gt;Probability as P&lt;/div&gt;" 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>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 KiB

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 KiB

After

Width:  |  Height:  |  Size: 225 KiB

+97 -104
View File
@@ -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: 2936), median weight of 65 kg (IQR: 5877), and median height of 168 cm (IQR: 163172).
\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.
+9
View File
@@ -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
+52 -36
View File
@@ -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}
+68 -79
View File
@@ -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 patternsdue 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.
+15 -14
View File
@@ -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 durationssuch as a standard
luteal phase length of 14 dayswhich 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.
+26 -2
View File
@@ -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}