2017-10-13 13 views
1

Ich versuche eine Regressionskurve an meine Daten anzupassen. Mein Code erzeugt das Diagramm und die Kurve, die ich möchte, aber ich brauche das Streudiagramm nicht - nur die Linie. Wenn ich die Handlung auskommentiere, schlägt mein Code fehl. Gibt es eine Möglichkeit, das Streudiagramm zu umgehen (zu umgehen, zu deaktivieren oder auszublenden)?Deaktivieren Sie das Streudiagramm, und drucken Sie nur die Regressionslinie

enter image description here

Letztlich werde ich multiple Regressionskurven auf meinem Diagramm und die Streudiagramme werden ablenkend vergleichen müssen. Auch mein R2 zeigt NULL. Gibt es einen Koeffizienten für R2?

Code unten. Hier

# get underlying plot 
    y <- dataset$'Fuel Consumed 24h' 
    x <-dataset$'Performance Speed' 
    plot(x, y, xlab = "Performance Speed", ylab = "24h Fuel Consumption") 

    # polynomial 
    f <- function(x,a,b,d) {(a*x^2) + (b*x) + d} 
    fit <- nls(y ~ f(x,a,b,d), start = c(a=1, b=1, d=1)) 
    co <- round(coef(fit), 2) 
    r2 <- format(summary(fit)$r.squared, digits = 3) 
    curve(f(x, a=co[1], b=co[2], d=co[3]), add = TRUE, col="red", lwd=2) 
    eq <- paste0("Fuel = ", co[1], "PS^2 ", ifelse(sign(co[2]) == 1, " + ", " - "), abs(co[2]), "PS +", co[3], " R2 = ", r2) 

    # print equation 
    mtext(eq, 3, line =-2) 
    mylabel = bquote(italic(R)^2 == .(format(r2, digits = 3))) 
    text(x = 1, y = 2.5, r2) 
+2

Versuchen Sie, 'type = "n"' '... plot (x, y, type = "n", ...' und nls tut eine R^2 zurückkehren, wie es Sinn machen, tut (obwohl ich denke, dass es einige Pakete gibt, die das tun). Das heißt, Ihr Modell ist nicht nichtlinear, und Sie können es mit "lm" anpassen – user20650

Antwort

1

ist ein Beispiel mit Autos Daten

Fit:

data(cars) 
f <- function(x,a,b,d) {(a*x^2) + (b*x) + d} 
fit <- nls(dist ~ f(speed,a,b,d), data = cars, start = c(a=1, b=1, d=1)) 

Güte der Anpassung: (als user20650 R2 wenig Sinn macht, für ein nicht lineares Modell wies darauf hin, vielleicht eine bessere Metrik RMSE ist)

rmse <- function(error) 
{ 
    sqrt(mean(error^2)) 
} 
error <- predict(fit, cars) - cars$dist 
rms <- rmse(error) 

eq <- paste0("Fuel = ", co[1], "PS^2 ", ifelse(sign(co[2]) == 1, " + ", " - "), abs(co[2]), "PS +", co[3], " RMSE = ", round(rms, 2)) 

Grundstück (keine Notwendigkeit, Grundstück zu nennen überhaupt - fügen Sie weitere Kurven mit Add = T):

curve(f(x, a=co[1], b=co[2], d=co[3]), col="red", lwd=2, from = min(cars$speed), to = max(cars$speed)) 
mtext(eq, 3, line =-2) 

enter image description here

andere Kurve hinzuzufügen:

f2 = function(x, a, b) {a + b*x} 
co2 = coef(lm(dist ~ speed, data = cars)) 
curve(f2(x, a = co2[1], b = co2[2]), col="blue", lwd=2, add = T) 

enter image description here

EDIT: wie pro user20650 Vorschlag (die nls wirklich nicht, da die Poly und nls Kurven erforderlich sind gleich)

co3 = coef(lm(dist ~ poly(speed, 2, raw=TRUE), data = cars)) 
curve(f3(x, a = co3[1], b = co3[2], c = co3[3]), col="grey", lty = 2, lwd=2, add = T) 
legend("topleft", legend = c("nls", "lm", "poly"), col = c("red", "blue", "grey"), lty =c(1,1,2)) 

enter image description here

Verwandte Themen