2017-10-13 2 views
1

J'essaie d'ajuster une courbe de régression à mes données. Mon code génère l'intrigue et la courbe que je veux, cependant, je n'ai pas besoin du nuage de points - seulement la ligne. Si je commente l'intrigue, mon code échoue. Y a-t-il un moyen de contourner, d'éteindre, de cacher le nuage de points?Désactiver le nuage de points et imprimer uniquement la ligne de régression

enter image description here

En fin de compte, je devrai comparer plusieurs courbes de régression sur mon graphique et les diagrammes de dispersion deviennent source de distraction. En outre, mon R2 montre NULL. Y a-t-il un coefficient pour R2?

Code ci-dessous.

# 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

essayer d'ajouter 'type = "n" complot' ... '(x, y, type = "n", ...', et nls doesnt retourner un r^2 comme il ne marche pas de sens (bien que je pense qu'il y a quelques paquets qui le font). Cela dit, votre modèle n'est pas non linéaire, et vous pouvez l'adapter avec 'lm' – user20650

Répondre

1

Voici un exemple avec des données voitures

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)) 

qualité de l'ajustement: (comme user20650 a souligné R2 n'a guère de sens pour un modèle non linéaire, peut-être une meilleure mesure est RMSE)

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)) 

terrain (pas besoin d'appeler tout terrain - ajouter d'autres courbes avec 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

ajouter une autre courbe:

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: selon user20650 suggestion (nls est vraiment pas nécessaire puisque les courbes de poly et nls sont les même)

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