jeux de données graphique de croissance CDC fournissent un bel exemple de ce que je suis en train d'accomplir: http://www.cdc.gov/growthcharts/html_charts/statage.htmComment interpoler linéairement une valeur dans une table en fonction d'une table de recherche différente dans PostgreSQL?
On suppose que leurs tables ont été transposées dans la forme suivante:
Table cdc avec des colonnes: chart_label, le sexe, l'âge, la protéine tau, la valeur
with tmp (chart_label, sex, age, tau, val) as (values
('bmi for age','F',2,0.03,14.14735),
('bmi for age','F',2,0.05,14.39787),
('bmi for age','F',2,0.1,14.80134),
('bmi for age','F',2,0.25,15.52808),
('bmi for age','F',2,0.5,16.4234),
('bmi for age','F',2,0.75,17.42746),
('bmi for age','F',2,0.85,18.01821),
('bmi for age','F',2,0.9,18.44139),
('bmi for age','F',2,0.95,19.10624),
('bmi for age','F',2,0.97,19.56411),
('bmi for age','F',2.041667,0.03,14.13226),
('bmi for age','F',2.041667,0.05,14.38019),
('bmi for age','F',2.041667,0.1,14.77965),
('bmi for age','F',2.041667,0.25,15.49976),
('bmi for age','F',2.041667,0.5,16.38804),
('bmi for age','F',2.041667,0.75,17.38582),
('bmi for age','F',2.041667,0.85,17.97371),
('bmi for age','F',2.041667,0.9,18.39526),
('bmi for age','F',2.041667,0.95,19.05824),
('bmi for age','F',2.041667,0.97,19.51534))
select * from tmp;
Je veux écrire une fonction PostgreSQL pour renvoyer le tau estimé pour un tableau donné, le sexe, l'âge et la valeur par interpolation linéaire pour estimer le tau s'il n'y a pas de valeur exacte disponible pour les entrées.
Par exemple (code pseudo):
select interp('bmi for age', 'F', 2.02, 15);
doit renvoyer une valeur tau entre 0,1 et 0,25 (à peu près 0,141) puisqu'il sera l'interpolation entre ces deux lignes:
('bmi for age','F',2,0.1,14.80134),
('bmi for age','F',2,0.25,15.52808),
Je réalise que l'interpolation linéaire peut ne pas être la solution idéale pour trouver le percentile approprié, mais comme je l'ai dit, les diagrammes de croissance des CDC sont une approximation appropriée de mon cas d'utilisation réel.
La seule chose que je devais aller était this post, et ces autres questions similaires sur SO link 1 et link 2