【问题标题】:Find equation of a line to fit data in R查找直线方程以拟合 R 中的数据
【发布时间】:2021-04-06 17:27:17
【问题描述】:

我刚开始学习 R 并试图展示汽车的 mpg 和马力之间的关系。我试图获得一条最适合的线来匹配数据,以便我可以使用它来预测其他值。

 #read data from csv file
 data <- read.csv("auto-mpg.csv")

 #get data
 df <- head(data, 350)

 #set x and y 
 x <- df$horsepower
 y <- df$mpg

 #change x from string to int
 x <- strtoi(x)

 #create scatterplot 
 scatter.smooth(x, y, main = "mpg vs horsepower",
 xlab = "horsepower", ylab = "mpg",
 pch = 19)

这是我想要指数衰减的图表

mpg vs horsepower graph

【问题讨论】:

  • scatter.smooth 使用loess,这是一组具有强制平滑度的局部拟合多项式 - 没有友好的方程。如果您想要指数衰减系数,请拟合指数衰减模型。 lm(log(y) ~ x)

标签: r machine-learning


【解决方案1】:

这里有两种方法。首先,按照@Gregor Thomas 的建议对 log(y) 进行线性拟合,然后对原始数据进行非线性拟合。您没有提供可重现的数据,所以我使用来自mtcars 的类似数据:

data(mtcars)
plot(mpg~hp, mtcars, pch=20)
mpg.lm <- lm(log(mpg)~hp, mtcars)  # Model is log(mpg) = a + b * hp
mpg.lm
# 
# Call:
# lm(formula = log(mpg) ~ hp, data = mtcars)
# 
# Coefficients:
# (Intercept)           hp  
#    3.460467    -0.003429  
# 
X <- seq(50, 350)
Y1 <- exp(predict(mpg.lm, data.frame(hp=X)))
lines(X, Y1, col="red")

红线表示合身。现在使用nls 直接拟合非线性模型。我们将使用第一个模型的系数来估计第二个模型的起始值:

a1 <- coef(mpg.lm)[1]
b1 <- coef(mpg.lm)[2]
mpg.nls <- nls(mpg ~ a * hp^b, mtcars, start=list(a=exp(a1), b=b1))
mpg.nls    # Model is mpg = a * hp^b
# Nonlinear regression model
#   model: mpg ~ a * hp^b
#    data: mtcars
#        a        b 
# 272.1171  -0.5404 
#  residual sum-of-squares: 288.7
# 
# Number of iterations to convergence: 7 
# Achieved convergence tolerance: 1.127e-07
Y2 <- predict(mpg.nls, data.frame(hp=X))
lines(X, Y2, col="blue")

蓝线表示非线性拟合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多