《Cookbook for R》数据统计篇
相关性分析与线性回归
示例数据
# 生成一些数据
# X 呈增加趋势
# Z 呈增加趋势 (缓慢)
# Y 与 xvar 成反比,xvar*zvar 成正比
set.seed(955)
xvar <- 1:20 + rnorm(20,sd=3)
zvar <- 1:20/4 + rnorm(20,sd=2)
yvar <- -2*xvar + xvar*zvar/5 + 3 + rnorm(20,sd=4)
# 用这些变量生成一个数据框
dat <- data.frame(x=xvar, y=yvar, z=zvar)
# 看一下头几行
head(dat)
#> x y z
#> 1 -4.252354 4.5857688 1.89877152
#> 2 1.702318 -4.9027824 -0.82937359
#> 3 4.323054 -4.3076433 -1.31283495
#> 4 1.780628 0.2050367 -0.28479448
#> 5 11.537348 -29.7670502 -1.27303976
#> 6 6.672130 -10.1458220 -0.09459239
1、相关性分析
相关系数
cor(dat$x, dat$y)
#> [1] -0.7695378
相关性矩阵(适用于多个变量)
cor(dat)
#> x y z
#> x 1.0000000 -0.769537849 0.491698938
#> y -0.7695378 1.000000000 0.004172295
#> z 0.4916989 0.004172295 1.000000000
# 只展现两位小数
round(cor(dat), 2)
#> x y z
#> x 1.00 -0.77 0.49
#> y -0.77 1.00 0.00
#> z 0.49 0.00 1.00
后面会讲可视化相关性矩阵
2、线性回归
dat$x
是预测变量, dat$y
是结果
可以使用数据框中的两列来完成,也可以直接使用数值向量来完成
# 两种写法得到的是同样的结果:
fit <- lm(y ~ x, data=dat) # 使用 x列 和 y列
fit <- lm(dat$y ~ dat$x) # 使用向量 dat$x 和 dat$y
fit
#>
#> Call:
#> lm(formula = dat$y ~ dat$x)
#>
#> Coefficients:
#> (Intercept) dat$x
#> -0.2278 -1.1829
# 即预测: y = -0.2278 - 1.1829*x
# 获取更多的信息:
summary(fit)
#>
#> Call:
#> lm(formula = dat$y ~ dat$x)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -15.8922 -2.5114 0.2866 4.4646 9.3285
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.2278 2.6323 -0.087 0.932
#> dat$x -1.1829 0.2314 -5.113 7.28e-05 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 6.506 on 18 degrees of freedom
#> Multiple R-squared: 0.5922, Adjusted R-squared: 0.5695
#> F-statistic: 26.14 on 1 and 18 DF, p-value: 7.282e-05
具有多个预测变量的线性回归:
y
作为线性回归的结果,x
z
作为预测变量
Note:下面的公式并没有检验x
和z
之间的相互作用
# 两种写法得到的结果一致
fit2 <- lm(y ~ x + z, data=dat)
fit2 <- lm(dat$y ~ dat$x + dat$z)
fit2
#>
#> Call:
#> lm(formula = dat$y ~ dat$x + dat$z)
#>
#> Coefficients:
#> (Intercept) dat$x dat$z
#> -1.382 -1.564 1.858
summary(fit2)
#>
#> Call:
#> lm(formula = dat$y ~ dat$x + dat$z)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -7.974 -3.187 -1.205 3.847 7.524
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -1.3816 1.9878 -0.695 0.49644
#> dat$x -1.5642 0.1984 -7.883 4.46e-07 ***
#> dat$z 1.8578 0.4753 3.908 0.00113 **
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 4.859 on 17 degrees of freedom
#> Multiple R-squared: 0.7852, Adjusted R-squared: 0.7599
#> F-statistic: 31.07 on 2 and 17 DF, p-value: 2.1e-06
3、相互作用
如何正确进行多元回归和交互测试是一个相当复杂的问题,在此不再赘述。
在这里,我们只需用 x
、z
和两者之间的交互作用来拟合一个模型
要模拟x
和z
之间的相互作用,必须添加x:z
项
或者将公式x*z
扩展为x+z+x*z
# 扩展公式的两种代码写法
fit3 <- lm(y ~ x * z, data=dat)
fit3 <- lm(y ~ x + z + x:z, data=dat)
fit3
#>
#> Call:
#> lm(formula = y ~ x + z + x:z, data = dat)
#>
#> Coefficients:
#> (Intercept) x z x:z
#> 2.2820 -2.1311 -0.1068 0.2081
summary(fit3)
#>
#> Call:
#> lm(formula = y ~ x + z + x:z, data = dat)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -5.3045 -3.5998 0.3926 2.1376 8.3957
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 2.28204 2.20064 1.037 0.3152
#> x -2.13110 0.27406 -7.776 8e-07 ***
#> z -0.10682 0.84820 -0.126 0.9013
#> x:z 0.20814 0.07874 2.643 0.0177 *
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 4.178 on 16 degrees of freedom
#> Multiple R-squared: 0.8505, Adjusted R-squared: 0.8225
#> F-statistic: 30.34 on 3 and 16 DF, p-value: 7.759e-07