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 输出指定参数
注:变量
model是lm()函数的分析结果,详见第 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 完整工作示例
- 任务:
- 从表格
mydata.csv中读取数据, - 对其中的列 y 与 x 进行一元线性拟合,拟合方程为 y = kx + b,
- 将拟合方程的斜率、截距、R2 和 p 值分别保存在变量
model_k、model_b、model_Rsq、model_p中, - 按照
[斜率] [截距] [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 = ",")当然,您也可以换成其他希望使用的分隔符。