Friends of mine in the dating circuit occasionally raise a qualm about a prospective match: *Ah! but they are so much older/younger than me! Is that unfair, that I am fishing outside my age bracket?*

There are various heuristics to address this problem--- e.g. a romantic match is acceptable if

- they are older than half your age plus 10 years
- if they are within +/- 10 years of your age
- etc.

PISH POSH. If comparable ages of romantic partners is important, we can SOLVE IT WITH DATA. This page will be the definitive answer to optimal dating based on selecting partners in the same population percentile as yourself.

To keep this simple, we cover classic vanilla heterosexual dating (males seeking females and vice versa), and we will do it with the population profile of Australia, but feel free to update this with whatever configurations of inter-gender/international attraction you see fit. You can add relationship status in there, relious community size etc.

At the end we will have a model of age-parity in dating, and another slice through the classic age mismatch problem.

Solutions here are non-prescriptive; I do not guarantee that utopia is attained either by following this model, or by ignoring it. I do not wish to quash love in any of its forms.

OK, estimated Australian population statistics are at ABS catalog number 3101.0, and we can download them using standard Australian data tools.
A little googling reveals additionally, that we are after table 59, *Estimated Resident Population By Single Year Of Age, Australia*.
I started writing an immaculate R script to download, extract and clean this data, but I got bored, so instead I simply copy-pasted the data for 2021 from a basic spreadsheet, which is less maintainable but TBH no-one is paying me for this.

OK, lets put in some groundwork.

## The age pyramid for datable people

```
library("dplyr")
pop.males = c(
776290, 831593, 835444, 762032,
837110, 918413, 940528, 928244,
815889, 817302, 794156, 762539,
711192, 617537, 554692, 387842,
249962, 208817)
pop.females = c(
733669, 785181, 788448, 717600,
786274, 903618, 959092, 939143,
838611, 832733, 817398, 787968,
753833, 662606, 592081, 419353,
295446, 325443)
bin.edges = c(
0, 5, 10, 15,
20, 25, 30, 35,
40, 45, 50, 55,
60, 65, 70, 75,
80, 85, 90)
# approximately delete ages under 16
# which is the age of consent in most of Australia;
# see https://en.wikipedia.org/wiki/Ages_of_consent_in_Oceania#Australia
pop.males = pop.males[-3:-1]
pop.males[1] = 0.8 * pop.males[1]
pop.females = pop.females[-3:-1]
pop.females[1] = 0.8 * pop.females[1]
bin.edges = bin.edges[-3:-1]
bin.edges[1] = bin.edges[1] + 1
```

Boring data prep over, lets plot some stuff.

```
library("plotly")
fig <- plot_ly(
x = bin.edges[1:length(bin.edges)-1],
) %>% add_lines(
y = pop.females,
name = "females",
line = list(shape = "hv"),
hovertemplate = 'Females: %{y:.3s}'
) %>% add_lines(
y = pop.males,
name = "males",
line = list(shape = "hv"),
hovertemplate = 'Males: %{y:.3s}'
) %>% layout(
xaxis = list(title = 'Age'),
yaxis = list(title = 'Population')
)
fig
```

So if you are, e.g. a male in the 30-35 age bracket, you know there are about 0.94M people in it with you.

What does that tell us? OK, men outnumber women in the young age brackets, up to about 30 years old. After that women are in the majority. What does this mean about whom to date?

## Population-aligned dating brackets

One model for who is near me in age is to take people who are *in the same percentile as me*.
This is perhaps best explained by example.
Let us construct some lookup tables of the population percentile; these will tell us where in the population a given age is (I am younger than \(x\%\) of the people if my age is \(y\).)

```
# Cumulative age tables
males.cumul = c(0, cumsum(pop.males))
females.cumul = c(0, cumsum(pop.females))
males.percentile = 100 * males.cumul/males.cumul[length(males.cumul)]
females.percentile = 100 * females.cumul/females.cumul[length(females.cumul)]
males.age.to.percentile = approxfun(bin.edges, males.percentile, rule=2)
females.age.to.percentile = approxfun(bin.edges, females.percentile, rule=2)
males.percentile.to.age = approxfun(males.percentile, bin.edges, rule=2)
females.percentile.to.age = approxfun(females.percentile, bin.edges, rule=2)
```

Let us put this into action: Suppose that I am 30 and male. How many males are younger than me (in the population of males above the age of consent)?

`sprintf("As a 30 year old male, I am at the %1.1f%% male age percentile",males.age.to.percentile(30))`

`## [1] "As a 30 year old male, I am at the 23.3% male age percentile"`

Nice. Which women are at the same percentile as me?

`sprintf("The population-adjusted equivalent age to mine, 30, amongst women is %1.1f", females.percentile.to.age(males.age.to.percentile(30)))`

`## [1] "The population-adjusted equivalent age to mine, 30, amongst women is 30.9"`

Note that the equivalent percentile in women is a little higher.
This is because males those populations are not equally distributed.
**tl;dr** If I am male, the females in the who are proportionally the same as me with respect to *their* gender, are about 1 year older than me.
By *proportionally* we mean that each of us would have about the same proprtion of the population in our *own* gender who are younger (or older) than us.

Demanding my potential partner be *exactly* the same proportional age as me is very strong.
How about we admit a "slop" factor, where people be in the same quintile of the population as me, i.e. that my partners are within \(\pm10\%\) of me.

```
library("plotly")
ages = seq(16, 80, by=0.1)
fig <- plot_ly(
x = ages,
) %>% add_lines(
y = females.percentile.to.age(males.age.to.percentile(ages)-10),
name = "lower bound",
hovertemplate = 'At male age %{x:.3s} lower bound for a female partner is %{y:.3s}'
) %>% add_lines(
y = females.percentile.to.age(males.age.to.percentile(ages)),
name = "equivalent age",
hovertemplate = 'At male age %{x:.3s} equivelent age for a female partner is %{y:.3s}'
) %>% add_lines(
y = females.percentile.to.age(males.age.to.percentile(ages)+10),
name = "upper bound",
hovertemplate = 'At male age %{x:.3s} upper bound for a female partner is %{y:.3s}'
) %>% layout(
xaxis = list(title = 'male age'),
yaxis = list(title = 'female age')
)
fig
```

We could do that over but for female-> male. However, that would just be the same graph reflected about the diagonal, so we leave that as an exercise for the student. More interesting, IMO, is to do this over for a hypothetical pansexual revolution, where everyone is indifferent to their partnerâ€™s gender.

```
# Cumulative age tables
pop.cumul = c(0, cumsum(pop.males+pop.females))
pop.percentile = 100 * pop.cumul/pop.cumul[length(pop.cumul)]
pop.age.to.percentile = approxfun(bin.edges, pop.percentile, rule=2)
pop.percentile.to.age = approxfun(pop.percentile, bin.edges, rule=2)
fig <- plot_ly(
x = ages,
) %>% add_lines(
y = pop.percentile.to.age(pop.age.to.percentile(ages)-10),
name = "lower bound",
hovertemplate = 'At age %{x:.3s} lower bound for any partner is %{y:.3s}'
) %>% add_lines(
y = pop.percentile.to.age(pop.age.to.percentile(ages)),
name = "equivalent age",
hovertemplate = 'At age %{x:.3s} equivelent age for any partner is %{y:.3s}'
) %>% add_lines(
y = pop.percentile.to.age(pop.age.to.percentile(ages)+10),
name = "upper bound",
hovertemplate = 'At age %{x:.3s} upper bound for any partner is %{y:.3s}'
) %>% layout(
xaxis = list(title = 'my age'),
yaxis = list(title = 'their age')
)
fig
```

Is this the ultimate answer to the question of the ages of partners?

No, but this answer satisfies me.

## No comments yet. Why not leave one?