按年份预测婴儿名字的最佳预测模型/方法

Best prediction model/ method for predicting baby names by year

Stack overflow 各位晚上好 - 我有一个关于预测名字的问题。所以我正在使用一个名为 babynames 的 R 包。该包具有以下变量 (Year(1880 to 2017), Sex(M/F), Name, n(this is count of name in that year), Prop (proportionality of that name)) - 示例

year sex   name          n   prop
   <dbl> <chr> <chr>     <int>  <dbl>
 1  1880 F     Mary       7065 0.0724
 2  1880 F     Anna       2604 0.0267
 3  1880 F     Emma       2003 0.0205
 4  1880 F     Elizabeth  1939 0.0199
 5  1880 F     Minnie     1746 0.0179

现在我的目标是预测 2025 年、2030 年和 2035 年最流行的名字。我的问题是预测未来流行名字的最佳方法是什么?我想过使用时间序列模型,但这些名字没有任何季节性,所以结果会很不准确——例如看看玛丽这个名字,以及这些年来名字的使用是如何变化的

所以我们似乎并没有真正的预测模式,并且可能有更多缺失的预测变量,如种族、宗教、姓氏、地区可能有助于做出预测——对我来说,随机猜测似乎可能比尝试拟合任何类型的预测模型更好。如果有的话,你会推荐什么型号?

谢谢

预测(婴儿)名字是 difficult/impossible,因为名字的受欢迎程度通常 driven/affected 受历史、社会学和其他外部(和不负责任的)事件的影响。


以名字"Mary"的流行度模式为例。

  • 可以想象,这个名字在 1910 年到 1920 年间的流行度增加与 1911 年女王 Mary of Teck 的加冕礼有关。
  • 第二次 post-1940 年的增长可能与乔治五世国王去世以及随后的 1936 年泰克玛丽的新身份 "Queen Mother" 有关。
  • 她于 1953 年去世可能导致随后几年的人气普遍下降。

另一个(不)著名的例子是名字 "Adolf"/"Adolph" 的流行度在 1918 年左右之后呈近指数衰减。

library(babynames)
library(tidyverse)
babynames %>%
    filter(name %in% c("Adolph", "Adolf")) %>%
    group_by(year) %>%
    summarise(n = sum(n)) %>%
    ggplot(aes(year, n)) +
    geom_line()


更新:探索性时间序列分析

我很想知道在时间序列分析的背景下我们可以用 "Adolph"/"Adolf" 数据做什么。由于时间序列结构更简单,我选择了该数据而不是 "Mary" 数据。希望这会给您一些想法,以便您进行进一步的批判性分析,并更好地了解您可以做什么和不能做什么。

让我们从将数据转换为 ts 时间序列对象开始。

library(babynames)
library(tidyverse)
library(zoo)
ts <- babynames %>%
    filter(name %in% c("Adolph", "Adolf")) %>%
    group_by(year) %>%
    summarise(n = sum(n)) %>%
    full_join(data.frame(year = seq(min(.$year), max(.$year)))) %>%
    arrange(year) %>%
    pull(n) %>%
    ts(start = 1880, frequency = 1) %>%
    na.approx()

由于缺少 2012 年和 2015 年的数据,我们需要用 "sensible" 值替换 NAs。这里我们使用 zoo::na.approx 用插值替换这些缺失的计数。

由于我们处理的是时间序列计数数据,因此对数转换值通常很有用。或者,我们可以使用 forecast::BoxCox 使用 lambda 的最佳值执行数据的 Box-Cox transformation(有关详细信息,请参阅 ?forecast::BoxCox)。

library(forecast)
ts <- BoxCox(ts, lambda = "auto")
attr(ts, "lambda")
#[1] 0.08813758

正如预期的那样,最佳 lambda 参数接近于零,这表明最佳转换非常接近对数转换。

让我们看一下经过差分和 Box-Cox 变换的数据

autoplot(diff(ts))

数据显示了一些或多或少的平稳期;我们还看到一些指示非平稳事件的尖峰,最明显的是 1912 年左右。

暂时忽略这些尖峰和其他时间序列异常,我们可以使用 forecast::auto.arima 大致了解底层 ARIMA 过程。

auto.arima(ts)
#Series: ts
#ARIMA(0,1,3)
#
#Coefficients:
#          ma1     ma2     ma3
#      -0.2568  0.0335  0.2605
#s.e.   0.0824  0.0833  0.0753
#
#sigma^2 estimated as 0.09039:  log likelihood=-28.38
#AIC=64.77   AICc=65.07   BIC=76.45

"best"模型对应单差分AR(3)模型。

我们现在 return 看到 1912 年左右的峰值。在时间序列干预分析的背景下,一个有趣的问题可能是问这些(干预)事件何时发生以及它们的影响是什么关于名字的流行度。为此,我们可以使用 ARIMAX 模型,该模型围绕从 auto.arima 推断出的 ARIMA(0, 1, 3) 模型构建。我们考虑了 1910 年到 1920 年之间一系列不同的干预年份,并为不同的干预年份拟合了不同的 ARIMAX 模型。然后,对于每个模型,我们提取模型系数以及模型的 AIC 和对数似然值。

library(TSA)
df <- imap(
    setNames(1910:1920, 1910:1920), ~arimax(
        ts,
        order = c(0, 1, 3),
        xtransf = data.frame(I = +(time(ts) == .x)),
        transfer = list(c(1, 0)))) %>%
    map(~ c(.x$coef, AIC = .x$aic, loglik = .x$loglik)) %>%
    map_df(bind_rows, .id = "yr_intervention")
df
## A tibble: 11 x 8
#   yr_intervention    ma1      ma2   ma3 `I-AR1` `I-MA0`   AIC loglik
#   <chr>            <dbl>    <dbl> <dbl>   <dbl>   <dbl> <dbl>  <dbl>
# 1 1910            -0.264  0.0157  0.252  0.991   0.270   66.0  -28.0
# 2 1911            -0.260  0.0314  0.258 -0.274  -0.305   64.5  -27.2
# 3 1912            -0.377 -0.0292  0.204  0.981   1.27    49.0  -19.5
# 4 1913            -0.259  0.0411  0.256 -0.664   0.132   65.9  -27.9
# 5 1914            -0.305 -0.0118  0.255  0.967   0.443   65.0  -27.5
# 6 1915            -0.276  0.00539 0.222  0.934   0.599   62.5  -26.3
# 7 1916            -0.264  0.0368  0.256  0.644   0.183   66.3  -28.1
# 8 1917            -0.257  0.0356  0.260  0.184   0.215   65.9  -28.0
# 9 1918            -0.257  0.0361  0.258 -0.357   0.0611  66.7  -28.3
#10 1919            -0.265  0.0425  0.262  0.613  -0.293   65.4  -27.7
#11 1920            -0.260  0.0361  0.264  0.0705 -0.160   66.3  -28.1

我们看到在 1912 年进行干预的 ARIMA(0, 1, 3) 模型最适合数据(导致最小的 AIC 和最大的对数似然)。

我们现在找到了一个模型,它包含 (1) ARIMA 类型的过程和 (2) 单个干预事件。在对模型进行更深入的批判性评估之前,您现在可以使用该模型来预测未来。这是否是 useful/sensible 值得怀疑,所以我将保留它。

回到您最初的问题,即什么是“按年份预测婴儿名字的[b]最佳预测模型/方法”,答案始终是:视情况而定。没有一个"best (prediction) model"。