📜  使用R的简单线性回归

📅  最后修改于: 2021-04-16 08:58:35             🧑  作者: Mango

线性回归:
它是预测分析的常用类型。这是一种统计方法,用于建模因变量和给定的一组自变量之间的关系。

线性回归有两种类型。

  • 简单线性回归
  • 多元线性回归

让我们讨论使用R的简单线性回归。

简单线性回归:
这是一种统计方法,可让我们总结和研究两个连续(定量)变量之间的关系。标记为x的一个变量被视为自变量,标记为y的另一个变量被视为因变量。假定这两个变量是线性相关的。因此,我们试图找到预测的响应值(y)的尽可能准确地作为特征或独立变量(x)的函数的线性函数。

为了理解这个概念,让我们考虑一个薪水数据集,其中为每个自变量(工作年限)提供因变量(薪水)的值。

薪水数据集

Years experienced                 Salary

       1.1                       39343.00
       1.3                       46205.00
       1.5                       37731.00
       2.0                       43525.00
       2.2                       39891.00
       2.9                       56642.00
       3.0                       60150.00
       3.2                       54445.00
       3.2                       64445.00
       3.7                       57189.00

出于一般目的,我们定义:
x作为特征向量,即x = [x_1,x_2,…。,x_n],
y作为响应向量,即y = [y_1,y_2,…。,y_n]
对于n个观察值(在上面的示例中,n = 10)。

给定数据集的散点图:

现在,我们必须找到一条适合上述散点图的线,通过该线我们可以预测y的任何值或x的任何值的响应
最合适的线称为回归线

回归线的方程式为:

y = a + bx   

其中y是预测的响应值,a是y截距,x是特征值,b是斜率。

为了创建模型,让我们评估回归系数a和b的值。一旦完成这些系数的估计,就可以预测响应模型。在这里,我们将使用最小二乘技术

最小二乘法的原理是找到适合给定数据的曲线的流行方法之一。说(x1,y1),(x2,y2)….(xn,yn)是实验中的n个观察值。我们有兴趣找到一条曲线

           y=f(x) .....(1)

紧密拟合大小为’n’的给定数据。现在,在x = x1处,当y的观测值为y1时,曲线(1)的y的预期值为f(x1)。那么残差可以由…定义。
   e1=y1-f(x1)  ...(2)

类似地,x2,x3…xn的残差由…给出

             e2=y2-f(x2) .....(3)
  ..........
         en=yn-f(xn) ....(4)

在评估残差时,我们会发现一些残差为正,而有些则为负。我们期待找到适合给定数据的曲线,以使任何xi处的残差最小。由于某些残差为正,而其他残差为负,并且由于我们希望对所有残差给予同等的重视,因此考虑这些残差的平方和是可取的。因此,我们考虑:

并找到最佳的代表曲线。

直线的最小二乘拟合
假设给定一个数据集(x1,y1),(x2,y2),(x3,y3)…..(xn,yn),来自一个实验的n个观测值。我们对拟合直线感兴趣。
   y=a+bx
给定的数据。

现在考虑:
  ei=yi-(axi+b)  i=1, 2, 3, 4....n
现在考虑ei的平方和


注意: E是参数a和b的函数,我们需要找到a和b使得E最小,而E最小的必要条件如下:

此条件产生:

上面的两个方程称为正态方程,可以求解它们以获得a和b的值。

E的表达式可以重写为:

R中回归分析的基本语法是

lm(Y ~ model) 

其中Y是包含要预测的因变量的对象,而model是所选数学模型的公式。

命令lm()提供了模型的系数,但没有提供进一步的统计信息。

以下R代码用于实现SIMPLE LINEAR REGRESSION

# Simple Linear Regression
# Importing the dataset
dataset = read.csv('salary.csv')
   
# Splitting the dataset into the
# Training set and Test set
install.packages('caTools')
library(caTools)
split = sample.split(dataset$Salary, SplitRatio = 0.7)
trainingset = subset(dataset, split == TRUE)
testset = subset(dataset, split == FALSE)
   
# Fitting Simple Linear Regression to the Training set
lm.r= lm(formula = Salary ~ YearsExperience,
                        data = trainingset)
coef(lm.r)
   
# Predicting the Test set results
ypred = predict(lm.r, newdata = testset)
   
install.packages("ggplot2")
library(ggplot2)
   
# Visualising the Training set results
ggplot() + geom_point(aes(x = trainingset$YearsExperience, 
                y = trainingset$Salary), colour = 'red') +
geom_line(aes(x = trainingset$YearsExperience,
y = predict(lm.r, newdata = trainingset)), colour = 'blue') +
          
ggtitle('Salary vs Experience (Training set)') +
xlab('Years of experience') +
ylab('Salary')
   
# Visualising the Test set results
  ggplot() +
  geom_point(aes(x = testset$YearsExperience, y = testset$Salary),
             colour = 'red') +
  geom_line(aes(x = trainingset$YearsExperience,
             y = predict(lm.r, newdata = trainingset)), 
             colour = 'blue') +
  ggtitle('Salary vs Experience (Test set)') +
  xlab('Years of experience') +
  ylab('Salary')

coef(lm.r)的输出:
拦截年经验
24558.39 10639.23

可视化训练集结果:

可视化测试集结果: