Yesterday at 6:14 PM, my girlfriend replied “okay” to a message that would ordinarily receive either “okayyy” or a heart reaction. My intuition suggested she was mad. Intuition is notoriously unreliable, so I built a model.
Let M denote the event that my girlfriend is mad at me. I begin with a prior: P(M) = 0.18, estimated from the previous 90 days.
Evidence:
E1 = "I'm fine."
P(E1 | M) = 0.71
P(E1 | ¬M) = 0.19
Posterior after E1: P(M | E1) ≈ 0.45
E2 = "do whatever you want"
P(E2 | M) = 0.64
P(E2 | ¬M) = 0.09
Naively, the posterior rises sharply; however, E1 and E2 are obviously not conditionally independent.
The main difficulty is that “I’m fine” and "do whatever you want” appear to be downstream of the same latent annoyance state. Treating them as independent would double-count evidence.
I therefore model the following latent states:
- M0 = not mad
- M1 = mildly annoyed
- M2 = mad about a specific thing
- M3 = mad that I don’t know what she’s mad about
- M4 = mad that I am doing Bayesian inference instead of asking
At 9:02 PM I finally asked, “Are you mad at me?” She replied, “No, but I am now because you’ve been acting weird all night.” This is strong evidence that the act of inference altered the system being measured.

The interesting state here is M4. If she can be mad that you're doing inference, then inference has a cost that depends on how much of it you do, and you should be asking whether the value of information beats that cost before running the model at all. For low-stakes evidence like a single "okay" I'd guess it usually doesn't. The optimal policy might be to deliberately not notice, which is a strange result but I think it's the correct one.
I agree in principle. The difficulty is that deciding whether to notice requires noticing.
You can precommit. Decide in advance that one-word replies under some threshold don't get modeled.
Strong post, but I think you need to model punctuation separately from lexical content. The likelihood ratio on "sure" versus "Sure." is enormous, and "okay" with a period is a different word from "okay" without one.
Seconding this, and reactions need their own channel too. In my data a thumbs-up reaction from my partner sits somewhere between M1 and M2. A heart is close to M0. A "haha" on something that wasn't a joke I don't have enough observations to say, and I'm hoping it stays that way.
Next time I'd suggest a control. Send something neutral that normally gets a fast reply (a meme, a photo of the cat) and measure response latency. Latency is much harder to fake than tone.
Latency is massively confounded by driving, showering and meetings. You'd need her calendar.
Shared calendars exist. We've had one since 2023, it's one of the better decisions we've made.
Prior of 0.18 over 90 days is about 16 days of mad. That seems high to start from? Not judging, I just think the number is doing more than you're treating it as.
The 90-day window includes her sister's wedding, which I'd treat as an outlier. Excluding the wedding weekend and the week after, the prior is 0.11.
What happened at the wedding?
Out of scope for this post.
Why assume stationarity? My girlfriend's "I'm fine" distribution shifts depending on whether she's at work.
Good point. Added Appendix C and updated the posterior downward from 0.93 to 0.81.
One-word "okay" at 6:14 on a weekday is very often "I'm on the train and typing with one thumb." If you add a state for that I suspect a lot of your M1 mass moves into it. I know because I send that exact message and I've had this exact conversation from the other side.
Where are the likelihoods from? If you estimated P(E1 | M) from the same 90 days as the prior then you're using the data twice.
They're from March to May, before we moved in together. I'm aware that's a regime change.
I built something like this in 2024, a script that scored incoming messages from my wife against a labeled set. Practical notes for anyone trying it. You need way more labeled data than you'd think because the mad class is rare, thankfully. Labeling is its own problem because you can't exactly ask for ground truth, so I labeled on whether dinner happened. Happy to share the labeled set if anyone wants it, it's around 1,400 messages.
Interested, especially if it has timestamps.
did you apologize though? actually asking, what was the outcome
I apologized at 9:20 for acting weird, which she accepted. My current estimate that she's still mad is around 0.3, mostly residual from E2.
Small thing, but what you're describing in the last paragraph isn't an observer effect in the quantum sense. It's closer to reactivity in psych measurement, the Hawthorne effect, where the subject changes because they know they're being observed.
The Hawthorne effect requires the subject to know she's being observed. She didn't know until 9:02.
bro just ask her
He did ask her, it's in the last paragraph. That's the observation that resolves the model.