2016-12-02 5 views
-2

Ich habe folgende kumulative Kostendaten ($ Milliarden) gegen unterschiedliche Anteile der Bevölkerung (% abgedeckt):R Interpolation von Punkten auf einer Summenkurve

test_df <- data.frame(cum.pop = c(0, 8.3, 37.7, 70.5, 90.5, 96.7, 98.7, 100), 
        cum.cost = c(0, 0.7, 3.4, 6.3, 14.1, 22.6, 28.3, 41.9)) 

Ich möchte berechnen, wie viel Prozent der Bevölkerung gedeckt von jeder 2 Milliarden Dollar.

EDIT:

Eine lineare Anpassung nicht das gewünschte Ergebnis, da die Kurve eine exponentielle ist, wie grafisch dargestellt unter: enter image description here

Wie passen ich eine exponentielle? Die Antwort von AEBilgrau mit Approfun funktioniert, aber die Ausgabe liefert keine genauen Ergebnisse.

Antwort

1

Sie können versuchen, Keile zu passen (obwohl es ein Risiko von Überanpassung ist):

library(spline) 
ispl <- interpSpline(cum.pop ~ cum.cost, test_df) 

# plots the interpolated spline 
plot(ispl)  
points(test_df[,2], test_df[,1], pch=19) 

enter image description here

cum.cost <- seq(0, 42, 2) # every 2B$ 
cum.cost 
# [1] 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 
# predicted pop 
pred.cum.pop <- predict(ispl, cum.cost)$y 
pred.cum.pop 
# [1] 0.00000 22.51128 44.72944 67.60543 82.57553 89.24549 90.81892 90.50744 90.98837 92.45519 94.38025 96.23579 97.53846 98.26304 98.65462 
#[16] 98.93703 99.17804 99.38472 99.56401 99.72285 99.86816 100.00689 

# plots othe predicted cum.pop for each 2B$ rise in cum.cost 
plot(ispl)  
points(cum.cost, pred.cum.pop, col='red', pch=19) 

enter image description here

+0

Das hat funktioniert, danke Sandipan. –

0

Es gibt keinen "besten Ansatz" - zumindest nicht, wenn Sie nicht angeben, was Sie mit "am besten" und mit wenigen Informationen meinen. Manche Ansätze sind besser als andere, sicher. Wie auch immer, ich denke, dass das nicht wirklich eine Programmierfrage ist. Sie müssen also entscheiden, welcher Ansatz zu Ihren Anforderungen passt und Sie möchten.

Wenn Sie einfache lineare Interpolation tun wollen (die für Ihre Zwecke könnte oder nicht in Ordnung sein könnte), können Sie so etwas wie dieses

# Load your toy data 
test_df <- data.frame(cum.pop = c(0, 8.3, 37.7, 70.5, 90.5, 96.7, 98.7, 100), 
         cum.cost = c(0, 0.7, 3.4, 6.3, 14.1, 22.6, 28.3, 41.9)) 

# Create a function that carries out the interpolation 
get_pop <- approxfun(x = test_df$cum.cost, y = test_df$cum.pop) 

# Call the function for every two billion dollars 
get_pop(seq(0, 40, by = 2)) 

Diese correspons zum Ablesen der Handlung

plot(cum.pop ~ cum.cost, data = test_df, type = "b") 
tun

Auf den ersten Blick scheint es, dass hier relativ wenig Rauschen in Ihren Daten ist. Das könnte also gut sein.

+0

Ja 'beste Ansatz' ist sehr vage AEBilgrau . Ich habe die Antwort bearbeitet, um speziell herauszufinden, wie man zu dieser Kurve passt, die exponentiell ist. Der lineare Ansatz funktionierte, lieferte jedoch keine genauen Ergebnisse. –

Verwandte Themen