Are they too old/young for me?

Dating, gender, age, and equity

October 14, 2017 — January 15, 2023

game theory
statistics
Figure 1

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

PISH POSH. Comparable ages of romantic partners is a quantitative question so we can SOLVE IT WITH DATA. This page is the DEFINITIVE answer to optimal dating based on selecting partners’ age in the optimal method: choosing them to be in the same population percentile as yourself.

To keep this simple, we start with 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. Bonus exercise: You could add relationship status in there, religious 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 which will resolve it forever.1

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. But if your love cannot handle a bit of quantitative critique, maybe you need to rethink it.

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, so…

OK, let us put in some data-prep groundwork.

1 The age pyramid for datable people

Code
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, let’s plot some stuff.

Code
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? Interesting stuff I did not know, in fact. Men outnumber women in the young age brackets, up to about 30 years old. After that women are in the majority. Huh. What does this mean about whom to date?

2 Age-aligned dating brackets

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

Code
# 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)

In 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)?

Code
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?

Code
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 and females are not equally distributed. tl;dr If I am male, the females 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 proportion 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 not plausible (although the astrological implications might be interesting). How about we admit a “slop” factor, where people are required to be in the same quintile of the population as me, i.e. that my partners are within \(\pm10\%\) of me. And with that final ingredient we have everything we need.

3 The Answer

Code
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} equivalent 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.

But THERE YOU GO, a perfect solution to the question of whom to date! If you disagree, you… can file a bug report, I guess.

OK, now we are in bonus time. Let us do this over for a hypothetical pansexual revolution, where everyone is indifferent to their partner’s gender:

Code
# 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)+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

Nice! Ok what are we missing? Selectable slop factor? A market in age-offset tokens? A dating app? A dating app that uses age-offset tokens? Something to do with blockchains for some reason? Feel free to approach me with your business plan free labour.

Oh, what I would like is a widget that showed me, GIVEN MY AGE, and a potential partner age, how far they are from me in quantile. That is tricky to plot in plotlyjs; suggestions?

Footnotes

  1. Forever on the internet is about 30 minutes, or until a better offer comes along.↩︎