使用R语言进行一元线性回归

1 数据准备

假设要分析的数据存放在 mydata.csv 中,该数据为二维表,结构如下:

x y
1 4.58
2 6.52
3 8.59
4 10.61
30 62.66

先用如下命令将数据文件导入 R 程序,并保存在变量 mydata 中:

mydata <- read.csv('mydata.csv')

2 执行分析

R 使用 lm() 函数对变量进行线性回归分析,基本语法是:

lm([因变量]~[自变量], data=[数据来源])

在我们的示例数据 mydata 中,列 y 是因变量,列 x 是自变量,希望得到形如 y=kx+b 的线性拟合关系。对这一组数据进行分析,需执行如下命令:

lm(y~x, data=mydata)

可得到如下输出:

Coefficients:
(Intercept)            x
      2.581        1.998

其中,

  • 第 1 列表示拟合直线的截距 b 为 2.581
  • 第 2 列表示拟合直线的斜率 k 为 1.998

3 模型诊断与结果解读

上述命令只给出了回归系数,但很多时候我们还需要其他模型诊断参数。我们可以先执行如下命令,将拟合结果保存在变量 model 中,以备进一步分析:

model <- lm(y~x, data=mydata)

然后,执行如下命令,查看更详细的拟合结果信息:

summary(model)

可得到如下输出:

Call:
lm(formula = y ~ x, data = mydata)

Residuals:
     Min       1Q   Median       3Q      Max
-0.51049 -0.20136  0.02632  0.22436  0.45603

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.580782   0.107702   23.96   <2e-16 ***
x           1.997971   0.006067  329.33   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2876 on 28 degrees of freedom
Multiple R-squared:  0.9997,    Adjusted R-squared:  0.9997
F-statistic: 1.085e+05 on 1 and 28 DF,  p-value: < 2.2e-16

对于一元线性回归,我们主要需要关注其中的如下参数:

  • 拟合参数,即表格 Coefficients
    • 表格第一行 (Intercept),即拟合方程的截距 b。截距的数值见 Estimate 列,不确定度见 Std. Error 列。
    • 表格第二行 x,即拟合方程的斜率 k。斜率的数值见 Estimate 列,不确定度见 Std. Error 列。
  • R2:即 Multiple R-squared
    • R2 是衡量模型拟合度的一个量,是一个比例形式,即 “被解释方差/总方差”。
    • R2 介于 0 至 1 之间,越接近 1 表示拟合效果越好。
    • 对于一元线性回归(只有一个自变量),我们看 R2(Multiple R-squared)即可。但对于多元线性回归,则需要看调整 R2(Adjusted R-squared)。调整 R2 可以为负值。
  • 显著性水平 p,即 p-value
    • p 越小,代表两个变量之间的相关性越显著。
    • 一般而言,p > 0.05 表明两个变量的相关性不显著
      p < 0.001 表明两个变量的相关性非常显著。

以上面的输出结果为例,该一元线性拟合方程:

  • 斜率为 1.997971 ± 0.006067
  • 截距为 2.580782 ± 0.107702
  • R2 = 0.9997,接近 1,表示拟合效果很好
  • p << 0.001,表示两个变量之间的相关性非常显著

4 输出指定参数

注:变量 modellm() 函数的分析结果,详见第 3 节。

4.1 只输出斜率

  • 输出斜率的值:summary(model)$coefficients[2, 1]
  • 输出斜率的不确定度:summary(model)$coefficients[2, 2]

4.2 只输出截距

  • 输出截距的值:summary(model)$coefficients[1, 1]
  • 输出截距的不确定度:summary(model)$coefficients[1, 1]

4.3 只输出 R2

使用如下命令:

summary(model)$r.squared

4.4 只输出 p 值

使用如下命令:

summary(model)$coefficients[2, 4]

5 完整工作示例

  • 任务:
    1. 从表格 mydata.csv 中读取数据,
    2. 对其中的列 y 与 x 进行一元线性拟合,拟合方程为 y = kx + b,
    3. 将拟合方程的斜率、截距、R2 和 p 值分别保存在变量 model_kmodel_bmodel_Rsqmodel_p 中,
    4. 按照 [斜率] [截距] [R 平方] [p 值] 的格式输出结果。

脚本代码如下:

#!/usr/bin/Rscript

# 1 读取数据
mydata <- read.csv('mydata.csv')

# 2 线性拟合
model <- lm(y~x, data=mydata)

# 3 输出结果
model_k <- summary(model)$coefficients[2, 1]
model_b <- summary(model)$coefficients[1, 1]
model_Rsq <- summary(model)$r.squared
model_p <- summary(model)$coefficients[2, 4]

cat(model_k, model_b, model_Rsq, model_p)

执行上述脚本,可得如下输出:

1.997971 2.580782 0.9997419 8.696959e-52

注:若希望输出结果用逗号分割,请在脚本最后一行的 cat() 中添加如下参数:, sep=",",修改后的代码是

cat(model_k, model_b, model_Rsq, model_p, sep = ",")

当然,您也可以换成其他希望使用的分隔符。

1 个赞

附:示例数据 mydata.csv

点击此处查看
x,y
1,4.58
2,6.52
3,8.59
4,10.61
5,12.77
6,14.83
7,16.94
8,18.65
9,20.56
10,22.05
11,24.71
12,26.34
13,28.31
14,30.14
15,32.59
16,34.80
17,36.76
18,38.82
19,40.22
20,42.06
21,44.10
22,46.38
23,48.91
24,50.76
25,52.46
26,54.10
27,56.89
28,58.98
29,60.39
30,62.66
1 个赞