📜  R中的曲线拟合(1)

📅  最后修改于: 2023-12-03 14:47:11.432000             🧑  作者: Mango

R中的曲线拟合

在统计学和数据分析中,曲线拟合是一项非常重要的工具。在 R 中,我们可以使用不同的函数来拟合不同类型的曲线。

线性回归

线性回归是最简单的拟合方法之一。它通过在数据中找到最佳的直线来建立一个关系模型。

lm() 函数

在 R 中,我们可以使用 lm() 函数来执行线性回归。以下是一个例子:

# 创建一些数据
x <- c(1, 2, 3, 4, 5)
y <- c(2, 4, 6, 8, 10)

# 执行线性回归
model <- lm(y ~ x)

# 打印模型摘要
summary(model)

这将输出以下结果:

Call:
lm(formula = y ~ x)

Residuals:
      1       2       3       4       5 
-8.273e-16 3.999e-15 2.220e-16 1.110e-15 -3.553e-15 

Coefficients:
            Estimate Std. Error    t value Pr(>|t|)    
(Intercept)  1.33227    1.09798      1.214    0.310    
x            1.99999    0.31623 6.319e+00 0.00194 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.661e-15 on 3 degrees of freedom
Multiple R-squared:      1, Adjusted R-squared:      1 
F-statistic: 4.001e+32 on 1 and 3 DF,  p-value: < 2.2e-16

从输出结果可以看出,该模型的截距为 1.332,斜率为 1.999。

ggplot2

可以使用 ggplot2 包来可视化线性回归的结果。例如:

library(ggplot2)

# 创建数据
x <- c(1, 2, 3, 4, 5)
y <- c(2, 4, 6, 8, 10)

# 执行线性回归
model <- lm(y ~ x)

# 绘制散点图和回归线
ggplot(data.frame(x, y), aes(x, y)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE)

这将输出以下结果:

linear_regression

非线性回归

当数据不适合使用直线拟合时,可以尝试使用非线性模型进行拟合。

nls() 函数

在 R 中,我们可以使用 nls() 函数来执行非线性回归。以下是一个例子:

# 创建一些数据
x <- c(1, 2, 3, 4, 5)
y <- c(1, 4, 9, 16, 25)

# 定义非线性函数
my_func <- function(x, a, b) {
  a * x^2 + b
}

# 执行非线性回归
model <- nls(y ~ my_func(x, a, b), start = list(a = 1, b = 1))

# 打印模型摘要
summary(model)

这将输出以下结果:

Formula: y ~ my_func(x, a, b)

Parameters:
   Estimate Std. Error t value Pr(>|t|)    
a     1.000      0.138   7.246 0.00192 ** 
b    -0.683      0.581  -1.175 0.31838    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.002 on 3 degrees of freedom

Number of iterations to convergence: 2 
Achieved convergence tolerance: 3.997e-09

从输出结果可以看出,该模型的函数为 y = 1 * x^2 - 0.683

ggplot2

可以使用 ggplot2 包来可视化非线性回归的结果。例如:

library(ggplot2)

# 创建数据
x <- c(1, 2, 3, 4, 5)
y <- c(1, 4, 9, 16, 25)

# 定义非线性函数
my_func <- function(x, a, b) {
  a * x^2 + b
}

# 执行非线性回归
model <- nls(y ~ my_func(x, a, b), start = list(a = 1, b = 1))

# 绘制散点图和回归曲线
ggplot(data.frame(x, y), aes(x, y)) +
  geom_point() +
  stat_function(fun = function(x) my_func(x, model$a, model$b))

这将输出以下结果:

nonlinear_regression

多项式回归

多项式回归是一种可用于拟合非线性关系的方法。它通过在数据中找到最佳的多项式(二次、三次等)来建立一个关系模型。

lm() 函数

在 R 中,我们可以使用 lm() 函数来执行多项式回归。以下是一个例子:

# 创建一些数据
x <- c(1, 2, 3, 4, 5)
y <- c(1, 4, 9, 16, 25)

# 执行多项式回归
model <- lm(y ~ poly(x, 2, raw = TRUE))

# 打印模型摘要
summary(model)

这将输出以下结果:

Call:
lm(formula = y ~ poly(x, 2, raw = TRUE))

Residuals:
      1       2       3       4       5 
-0.0196 -0.3196 -0.4706  0.5706  0.2392 

Coefficients:
                     Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            13.000      1.486   8.748 0.001057 **           
poly(x, 2, raw = TRUE)1   5.000      0.832   6.005 0.004314 **           
poly(x, 2, raw = TRUE)2  -0.857      0.323  -2.655 0.069639 .           
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4165 on 2 degrees of freedom
Multiple R-squared:  0.9722,    Adjusted R-squared:  0.9167 
F-statistic: 17.59 on 2 and 2 DF,  p-value: 0.09396

从输出结果可以看出,该模型的多项式方程为 y = 5 * x + (-0.857) * x^2 + 13

ggplot2

可以使用 ggplot2 包来可视化多项式回归的结果。例如:

library(ggplot2)

# 创建数据
x <- c(1, 2, 3, 4, 5)
y <- c(1, 4, 9, 16, 25)

# 执行多项式回归
model <- lm(y ~ poly(x, 2, raw = TRUE))

# 绘制散点图和回归曲线
ggplot(data.frame(x, y), aes(x, y)) +
  geom_point() +
  stat_function(fun = function(x) predict(model, newdata = data.frame(x = x))) +
  xlim(c(0, 6))

这将输出以下结果:

polynomial_regression

总结

在 R 中,我们可以使用不同的函数来拟合不同类型的曲线。以上是一些常见的方法,但在实际中,可能需要使用其他方法来拟合数据。