Aproximadamente cuando vas a morir

Sep 09 2020

Una tabla de mortalidad o de vida es una herramienta actuarial que da la probabilidad de que una persona de edad \$A\$años morirán en el próximo año y se utiliza para ayudar a calcular las primas de los seguros de vida, entre otras cosas. Una de las primeras personas en compilar una tabla de vida fue Edmond Halley , de fama cometaria. Estas probabilidades también le permiten estimar la esperanza de vida para una edad determinada, que es el objetivo de este desafío.

Aporte

  • Un número entero de 0 a 119, inclusive.
  • Un indicador de sexo M / F.

Producción

  • Una aproximación de la esperanza de vida para esa edad / sexo de acuerdo con la Tabla de Mortalidad 2016 de la Administración del Seguro Social , también conocida como la tabla de Vida Actuarial, cuya parte relevante se puede encontrar a continuación.
Age     M           F
0       75.97       80.96
1       75.45       80.39
2       74.48       79.42
3       73.50       78.43
4       72.52       77.45
5       71.53       76.46
6       70.54       75.47
7       69.55       74.47
8       68.56       73.48
9       67.57       72.49
10      66.57       71.50
11      65.58       70.50
12      64.59       69.51
13      63.60       68.52
14      62.61       67.53
15      61.63       66.54
16      60.66       65.55
17      59.70       64.57
18      58.74       63.59
19      57.79       62.61
20      56.85       61.63
21      55.91       60.66
22      54.98       59.69
23      54.06       58.72
24      53.14       57.75
25      52.22       56.78
26      51.31       55.82
27      50.39       54.85
28      49.48       53.89
29      48.56       52.93
30      47.65       51.97
31      46.74       51.01
32      45.83       50.06
33      44.92       49.10
34      44.01       48.15
35      43.10       47.20
36      42.19       46.25
37      41.28       45.30
38      40.37       44.36
39      39.47       43.41
40      38.56       42.47
41      37.65       41.53
42      36.75       40.59
43      35.85       39.66
44      34.95       38.73
45      34.06       37.80
46      33.17       36.88
47      32.28       35.96
48      31.41       35.04
49      30.54       34.13
50      29.67       33.23
51      28.82       32.33
52      27.98       31.44
53      27.14       30.55
54      26.32       29.68
55      25.50       28.81
56      24.70       27.94
57      23.90       27.09
58      23.12       26.24
59      22.34       25.39
60      21.58       24.56
61      20.83       23.72
62      20.08       22.90
63      19.35       22.07
64      18.62       21.26
65      17.89       20.45
66      17.18       19.65
67      16.47       18.86
68      15.77       18.07
69      15.07       17.30
70      14.39       16.54
71      13.71       15.79
72      13.05       15.05
73      12.40       14.32
74      11.76       13.61
75      11.14       12.92
76      10.53       12.23
77      9.94        11.57
78      9.37        10.92
79      8.82        10.29
80      8.28        9.68
81      7.76        9.09
82      7.26        8.52
83      6.79        7.98
84      6.33        7.45
85      5.89        6.95
86      5.48        6.47
87      5.08        6.01
88      4.71        5.57
89      4.37        5.16
90      4.05        4.78
91      3.75        4.43
92      3.48        4.11
93      3.23        3.81
94      3.01        3.55
95      2.81        3.31
96      2.64        3.09
97      2.49        2.90
98      2.36        2.73
99      2.24        2.58
100     2.12        2.42
101     2.01        2.28
102     1.90        2.14
103     1.80        2.01
104     1.70        1.88
105     1.60        1.76
106     1.51        1.65
107     1.42        1.54
108     1.34        1.44
109     1.26        1.34
110     1.18        1.24
111     1.10        1.15
112     1.03        1.06
113     0.96        0.98
114     0.90        0.91
115     0.84        0.84
116     0.78        0.78
117     0.72        0.72
118     0.66        0.66
119     0.61        0.61

Para mayor comodidad, aquí están en forma amplia (de 0 a 119 años en orden):

M: [75.97, 75.45, 74.48, 73.5, 72.52, 71.53, 70.54, 69.55, 68.56, 67.57, 66.57, 65.58, 64.59, 63.6, 62.61, 61.63, 60.66, 59.7, 58.74, 57.79, 56.85, 55.91, 54.98, 54.06, 53.14, 52.22, 51.31, 50.39, 49.48, 48.56, 47.65, 46.74, 45.83, 44.92, 44.01, 43.1, 42.19, 41.28, 40.37, 39.47, 38.56, 37.65, 36.75, 35.85, 34.95, 34.06, 33.17, 32.28, 31.41, 30.54, 29.67, 28.82, 27.98, 27.14, 26.32, 25.5, 24.7, 23.9, 23.12, 22.34, 21.58, 20.83, 20.08, 19.35, 18.62, 17.89, 17.18, 16.47, 15.77, 15.07, 14.39, 13.71, 13.05, 12.4, 11.76, 11.14, 10.53, 9.94, 9.37, 8.82, 8.28, 7.76, 7.26, 6.79, 6.33, 5.89, 5.48, 5.08, 4.71, 4.37, 4.05, 3.75, 3.48, 3.23, 3.01, 2.81, 2.64, 2.49, 2.36, 2.24, 2.12, 2.01, 1.9, 1.8, 1.7, 1.6, 1.51, 1.42, 1.34, 1.26, 1.18, 1.1, 1.03, 0.96, 0.9, 0.84, 0.78, 0.72, 0.66, 0.61]
F: [80.96, 80.39, 79.42, 78.43, 77.45, 76.46, 75.47, 74.47, 73.48, 72.49, 71.5, 70.5, 69.51, 68.52, 67.53, 66.54, 65.55, 64.57, 63.59, 62.61, 61.63, 60.66, 59.69, 58.72, 57.75, 56.78, 55.82, 54.85, 53.89, 52.93, 51.97, 51.01, 50.06, 49.1, 48.15, 47.2, 46.25, 45.3, 44.36, 43.41, 42.47, 41.53, 40.59, 39.66, 38.73, 37.8, 36.88, 35.96, 35.04, 34.13, 33.23, 32.33, 31.44, 30.55, 29.68, 28.81, 27.94, 27.09, 26.24, 25.39, 24.56, 23.72, 22.9, 22.07, 21.26, 20.45, 19.65, 18.86, 18.07, 17.3, 16.54, 15.79, 15.05, 14.32, 13.61, 12.92, 12.23, 11.57, 10.92, 10.29, 9.68, 9.09, 8.52, 7.98, 7.45, 6.95, 6.47, 6.01, 5.57, 5.16, 4.78, 4.43, 4.11, 3.81, 3.55, 3.31, 3.09, 2.9, 2.73, 2.58, 2.42, 2.28, 2.14, 2.01, 1.88, 1.76, 1.65, 1.54, 1.44, 1.34, 1.24, 1.15, 1.06, 0.98, 0.91, 0.84, 0.78, 0.72, 0.66, 0.61]

Reglas de puntuación

Para este desafío, gana la presentación con la puntuación más baja . Tu puntuación será igual a \$(1+L)\times(1 + M)\$, donde \$L\$es la longitud de su código en bytes y \$M\$es el error cuadrático medio de sus estimaciones, redondeado a dos decimales. Este es un programa de puntuación para \$M\$.

Otras reglas

  • Las lagunas legales estándar están prohibidas.
  • La entrada es bastante flexible. Puede especificar dos valores distintos para M / F: 'M'/'F', 0/1. Si realmente quisiera, incluso podría tomar un solo entero, con el signo que representa M / F, pero tenga en cuenta que 0es una entrada para ambos. O las partes reales e imaginarias de un número complejo.
    • No tiene que tomar ninguna entrada si no lo desea, lo que debería permitirle publicar respuestas que siempre devuelvan 4 o lo que sea.
  • En caso de que haya alguna confusión, la salida no puede ser aleatoria.
  • Incluya un medio para verificar su puntaje.
  • Las incorporaciones que tienen esta tabla de mortalidad exacta no están prohibidas, pero implemente también su propia solución.
  • Se anima a dar explicaciones.

Bonificaciones adicionales:

Dado que R es el idioma del mes para septiembre de 2020 , otorgaré una recompensa de 500 representantes a la respuesta R con la mejor puntuación al final del mes.

Respuestas

12 Arnauld Sep 09 2020 at 01:26

JavaScript (ES6), Puntuación:  59,51  59,10

L = 52 bytes, M ≈ 0,1150638

Espera (n)(m), donde m es 1 para Hombre o 0 para Mujer.

n=>m=>81-5*m-(.9+m/51+(70-27*m-(.92-m/7)*n)/2e4*n)*n

¡Pruébelo en línea!

o Obtener los datos sin procesar en el formato esperado por el programa de puntuación .

Método

Esto se basa en dos regresiones cúbicas, con una compensación entre el tamaño del código y la precisión.

Para las mujeres, esto calcula:

$$f_0(x)=81-\frac{9}{10}x-\frac{7}{2000}x^2+\frac{23}{500000}x^3$$

Y para los hombres:

$$f_1(x)=76-\frac{469}{510}x-\frac{43}{20000}x^2+\frac{17}{437500}x^3$$

¿Qué tan precisa es?

A continuación se muestra un gráfico de los errores que produce la función según la edad y el sexo.

12 RobinRyder Sep 09 2020 at 17:27

R , puntuación = 67,47 47,92

30 bytes, MSE = 0.54587

-1 byte (y -1,47 en puntuación) gracias a Dominic van Essen.

pnorm(scan(),31,41,F)*scan()-2

¡Pruébelo en línea!

El formato de entrada es: edad como un número entero, luego una nueva línea, luego sexo, luego una nueva línea. El sexo está codificado como 98 para hombres y 106 para mujeres.

Aproxima las tablas actuariales por la función de supervivencia de una distribución normal (la función de supervivencia es 1 - la función de distribuciones acumulativas). Probé algunas familias de distribución, y lo normal minimizó el MSE.

Deje \$\phi(x;\mu,\sigma)\$ser la densidad de a \$\mathcal N(\mu,\sigma^2)\$distribución. La aproximación utilizada es

\$f(x)=a+m\int_x^\infty\phi(t;\mu,\sigma)\,dt\$

Intenté usar diferentes valores de parámetros para hombres y mujeres, pero la mejor puntuación se obtiene usando los mismos valores de \$a\$, \$\mu\$y \$\sigma\$y seleccionando solo valores diferentes para \$m\$. Desde \$m=98\$para hombres y \$m=106\$ para las mujeres son los valores óptimos, los uso para codificar el sexo directamente.

(En realidad, los valores óptimos serían \$m=98.25528\$para hombres y \$m=106.34315\$para las mujeres, pero usar esos valores para definir los sexos realmente se siente como una trampa. Llevaría a una puntuación de 47,49, una ligera mejora).

Gráfico de la aproximación para hombres:

Gráfico de la aproximación para mujeres:

7 J42161217 Sep 09 2020 at 04:08

Wolfram Language (Mathematica) , puntaje 151.8,

32 bytes, 3,6 MSE

#-Cos[x(Pi-.02)/238]~Sum~{x,#2}&

¡Pruébelo en línea!

Noté que las diferencias de los valores eran similares a Cos(x) [0,pi/2]
Entonces, el Cos (x) acumulado funciona bastante bien en los hombres ...

HOMBRE
MSE 0,90

MUJER
MSE 6,29
( Supongo que Cos (x) entiende mejor a los hombres ... )

Un agradecimiento especial a @att por reducir mi código a 33 bytes

7 Dingus Sep 09 2020 at 10:36

Rubí , puntuación 56,12 ... 43,94 43,92

\$L=35\$, \$M\approx0.220060\$

->x,f{f.*1.87e6-(21676+(66-x)*x)*x}

¡Pruébelo en línea!

La entrada es una edad \$x\$y un flotador \$f\$, que es 4.027e-5para hombres y 4.362e-5mujeres. (Vea a continuación una versión alternativa que toma \$f\$en cambio, como un número entero). El enfoque consiste en ajustar un polinomio cúbico a la esperanza de vida promediada entre ambos sexos, luego escalar este polinomio por un factor de sexo para recuperar aproximaciones específicas de sexo. El polinomio seleccionado para la esperanza de vida media es$$ \frac{x^3-66x^2-21676x+1870000}{23840} $$ y el factor sexo es $$ \begin{cases}0.96,\;\text{male}\\1.04,\;\text{female}.\end{cases} $$En otras palabras, la esperanza de vida de un hombre es aproximadamente \$0.96\$veces la de un humano promedio (hombre o mujer). De manera similar, la esperanza de vida de una mujer es aproximadamente \$1.04\$ veces la de un humano promedio.

La siguiente gráfica muestra el error al cuadrado en función de la edad para cada sexo. La línea gris discontinua representa el error cuadrático medio para ambos sexos.

One point of interest in the code is the explicit call to the * method of the float f. Everything to the right of f.* is interpreted as the method argument, so the polynomial doesn't need to be enclosed in parentheses.


Ruby, score 50.06

\$L=40\$, \$M\approx0.220981\$

->x,f{f/9e3*(56541-(656+(2-x/33r)*x)*x)}

Try it online!

Despite being within the rules, taking \$f\$ as a float (as above) feels more than a little 'cheaty'. This version uses the same general approach, but here \$f\$ is an integer: \$12\$ for male and \$13\$ for female. The polynomial used for the average life expectancy is $$ \frac{x^3/33-2x^2-656x+56541}{720}. $$

5 xash Sep 09 2020 at 05:49

J, score 53.76 52.78

L = 46, M = 0.122983

Toma M / F como 1/0 en el lado derecho y edad en el lado izquierdo. Aproximación polinomial de tercer grado simple. Los polinomios J se leen de izquierda a derecha, es decir, 81 - 0.9x - 347e-5x² + 455e-7x³para el caso 1. El caso 0 solo modifica un poco los números a 76 - 0.92x - 207e-5x² + 385e-7x³. p.evalúa el polinomio en x, en este caso la edad.

p.~81 _0.9 _347e_5 455e_7-5 0.02 _14e_4 7e_6&*

¡Pruébelo en línea!

3 ovs Sep 09 2020 at 01:25

Python 3 , puntuación 94,40, 58 bytes, 0,60 MSE

Aproximaciones lineales simples. Truepara mujer y Falsepara hombre .

lambda a,g:[75+5*g-(.89+g/30)*a,12-a/11][a>81]+(70<a<90)*2

¡Pruébelo en línea!

Representación visual de la aproximación:

3 DominicvanEssen Sep 09 2020 at 15:55

R , puntuación 46.00036

Empujando los límites de 'dos ​​valores distintos' como entrada más que un poco ...

45 bytes, error cuadrático medio 7.9e-6

function(a,s)s%/%gmp::as.bigz(1e4)^a%%1e4/100

¡Pruébelo en línea!

La entrada es un número entero acomo la edad y uno de los dos valores de 'entero grande' spara especificar el sexo de M / F.
La salida es un número 'grande racional'.

Como (presumiblemente) alentado por las reglas de entrada generosamente flexibles, los valores que especifican el sexo son integrales para el cálculo (aunque en este caso probablemente más de lo previsto ...).
Cada uno de los números enteros grandes de M, F se construye como la 1 ... 120.a potencia de 1e4 multiplicada por 100 veces la esperanza de vida en cada edad: esencialmente, una codificación base 10000. La life_expectancyfunción simplemente decodifica el adígito base-10000 y lo divide por 100.

Aunque la función usa la gmpbiblioteca de precisión arbitraria para los cálculos, una pequeña cantidad de los valores decodificados aún contienen inexactitudes en el segundo lugar decimal, por razones que no entiendo.
Sin embargo, el error cuadrático medio es (como se esperaba) lo suficientemente cerca de cero como para que esto no importe, ya que tenemos que sumarle 1 de todos modos para obtener la puntuación.

2 DominicvanEssen Sep 09 2020 at 21:37

R , puntuación 75,74445

61 bytes, error cuadrático medio 0,222

function(a,s)s*predict(loess(c(82,58,35,14,3,1)~c(0:5*24)),a)

¡Pruébelo en línea!

Utiliza el suavizado de loess para interpolar entre puntos de datos codificados de forma rígida.

Las curvas M y F son notablemente similares entre sí después de escalar (en 0.92x); vea los puntos negros y grises en el gráfico, por lo que los puntos codificados de forma rígida se toman de la media de las dos curvas (escaladas), y luego redondeado a valores agradables y cortos. La línea roja del gráfico muestra los valores interpolados.

Desafortunadamente (para mí), el sistema de puntuación de agregar 1 al error cuadrático medio recompensa fuertemente los ajustes razonablemente cercanos, pero no da mucha más recompensa por un ajuste muy cercano, por lo que la longitud adicional del código aquí significa que el puntaje general es aún peor que el ajuste más holgado de Robin Ryder a una distribución normal.

2 GregMartin Sep 11 2020 at 01:30

Wolfram Language (Mathematica) , puntuación 34,16

27 bytes, error cuadrático medio 0,21676 (redondeado a 0,22)

#3(#2-#+Sqrt[(#2-#)^2+#4])&

¡Pruébelo en línea!

Una función sin nombre (que llamaremos fpara fines de discusión) que toma dos argumentos (en este orden), la edad (un número entero de 0 a 119) y los indicadores para mujer o hombre en esta forma:

  • indicador de "mujer": Sequence[83.506,0.4794,222.8]
  • indicador de "hombre": Sequence[80.596,0.4636,248.5]

En Mathematica, f[a,Sequence[b,c,d]]es lo mismo que f[a,b,c,d]; por lo que Sequence[b,c,d]es casi exactamente un triple ordenado, excepto que es mejor para conectarse a funciones.

El código anterior implementa la función matemática

\$ f(a,b,c,d) = c\big( b-a + \sqrt{(b-a)^2+d} \big), \$

donde \$a\$es la edad y \$b,c,d\$ son parámetros numéricos que se utilizan para optimizar el ajuste con los datos.

Esta forma específica fue motivada por mi percepción de que los gráficos de los datos para cada sexo parecían una hipérbola con una asíntota inclinada a la izquierda y una asíntota horizontal a la derecha, que se puede llevar a la forma paramétrica anterior (aquí \$(b,0)\$son las coordenadas del centro de la hipérbola, \$2c\$es la pendiente de la asíntota inclinada, y \$d\$controla qué tan lejos del centro se dobla la hipérbola). Luego se utilizó un algoritmo evolutivo para ajustar los parámetros para cada sexo por separado; Los experimentos sugieren que hay un mínimo local único para cada conjunto de datos, ya que todos los intentos convergieron a valores muy similares para \$b,c,d\$.

(Técnicamente, toda la función podría haberse utilizado como indicador de sexo, lo que llevó a la solución de 4 bytes #2@#con una puntuación de 6.1 . Pero muchas de las presentaciones podrían haber hecho cosas similares).