飞道的博客

【统计学】R语言简单回归及其可视化

333人阅读  评论(0)


数据:
本案例使用的数据为人造数据,仅用于学习分析过程。
kid.score 学生成绩
mom.hs 母亲是否有高中学历
mom.iq 母亲智商

    kid.score mom.hs mom.iq
1      91.18      0 121.50
2      70.00      0 102.00
3      80.00      0 107.00
4      93.31      1 110.00
5      98.00      1 120.00
6      99.00      1 123.00
7      92.88      1 126.24
8      95.87      1 114.56
9      93.73      1 100.00
10     80.70      0 108.72
11     95.44      1 128.00
12     92.03      1 110.00
13     90.00      0 129.00
14     95.01      1 120.40
15     94.59      1  97.04
16     92.45      0 120.00
17     88.00      0 100.00
18     83.50      0  99.00
19     98.00      1 112.00
20     86.50      0 100.20
21     90.75      0 102.88
22     91.60      0 104.20
23     94.16      1 120.40
24     96.40      1 122.40

(一)做简单回归曲线检验母亲智商、学历与学生成绩的关系

#读入data
data1 <- read.csv("chapter 3 data1.csv")
kid.score <- data1$kid.score
mom.hs <- data1$mom.hs
mom.iq <- data1$mom.iq
#拟合有两个变量的回归模型
fit.3 <- lm (kid.score ~ mom.hs + mom.iq)
summary(fit.3)#观察模型主要参数
#拟合一个变量的回归模型(单个变量制作平面可视图)

结果:

Call:
lm(formula = kid.score ~ mom.hs + mom.iq)

Residuals:
     Min       1Q   Median       3Q      Max 
-16.9100  -2.9430   0.7737   4.6099   8.9200 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept) 75.74834   31.49762   2.405   0.0255 *
mom.hs       0.14823    0.18918   0.784   0.4420  
mom.iq      -0.07502    0.05608  -1.338   0.1953  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.734 on 21 degrees of freedom
Multiple R-squared:  0.09141,	Adjusted R-squared:  0.004876 
F-statistic: 1.056 on 2 and 21 DF,  p-value: 0.3655

结果fit.3不显著

(二)母亲智商与学生成绩关系的回归散点图(单变量可视化)

fit.2 <- lm (kid.score ~ mom.iq)
plot (mom.iq, kid.score, xlab="Mother IQ score", ylab="Child test score")
curve (coef(fit.2)[1] + coef(fit.2)[2]*x, add=TRUE)#绘制fit.2的回归直线
#curve (cbind(1,x) %*% coef(fit.2), add=TRUE)也可以

(三)在一张图上表现有无高中学历的回归散点图(双变量可视化)

fit.3 <- lm (kid.score ~ mom.hs + mom.iq)
colors <- ifelse (mom.hs==1, "black", "gray")
plot (mom.iq, kid.score, xlab="Mother IQ score", ylab="Child test score",
      col=colors, pch=20)
#***下面这种写法也可以**********************************************************
#plot (mom.iq, kid.score, xlab="Mother IQ score", ylab="Child test score", type="n")
#points (mom.iq[mom.hs==1], kid.score[mom.hs==1], pch=20, col="black")
#points (mom.iq[mom.hs==0], kid.score[mom.hs==0], pch=20, col="gray")
#***************************************************************
curve (cbind (1, 1, x) %*% coef(fit.3), add=TRUE, col="black")
curve (cbind (1, 0, x) %*% coef(fit.3), add=TRUE, col="gray")

图中黑色为有高中学历
灰色为无高中学历

(四)绘制带有模拟曲线的回归线

#写一个模拟函数sim
sim <- function(input){
   
  n.sim <- 1000
  beta_ori <- summary(input)$coefficients[,1]
  std_ori <- summary(input)$coefficients[,2]
  beta <- rnorm(n.sim,mean=beta_ori[1],sd=std_ori[1])
  for(i in 2:length(beta_ori)){
   
    beta_plus <- rnorm(n.sim,mean=beta_ori[i],sd=std_ori[i])
    beta <- cbind(beta,beta_plus)
  }
  return(beta)
}
#调用函数,返回的是beta
fit.2.sim <- sim(fit.2)
plot (mom.iq, kid.score, xlab="Mother IQ score", ylab="Child test score")
for (i in 1:10){
   
  curve (fit.2.sim[i,1] + fit.2.sim[i,2]*x, add=TRUE,col="gray")
}
curve (coef(fit.2)[1] + coef(fit.2)[2]*x, add=TRUE, col="black")

#绘制含有模拟曲线的fit.3回归线
fit.3 <- lm (kid.score ~ mom.hs + mom.iq)
beta.hat <- coef(fit.3)
beta.sim <- sim(fit.3)
par(mfrow=c(1,2))
plot(mom.iq, kid.score, xlab="Mother IQ score", ylab="Child test score")
for (i in 1:10){
   
  curve (cbind (1, mean(mom.hs), x) %*% beta.sim[i,], lwd=.5,
         col="gray", add=TRUE)
}
curve (cbind (1, mean(mom.hs), x) %*% beta.hat, col="black", add=TRUE)
plot (mom.hs, kid.score, xlab="Mother completed high school",ylab="Child test score")
for (i in 1:10){
   
  curve (cbind (1, x, mean(mom.iq)) %*% beta.sim[i,], lwd=.5,
         col="gray", add=TRUE)
}
curve (cbind (1, x, mean(mom.iq)) %*% beta.hat, col="black", add=TRUE)


这些灰色的拟合线分布非常分散,IQ 对于 test-score 的影响的拟合曲线的斜率有的为正,有的为负,虽然大多数都为负,但可以看出这个影响是可疑的。
但高中学历(右边的图),斜率均为正,说明这个影响是可信的。

(五)用fit.3回归方程来做预测

用原始数据拟合出的方程可以用来进行预测。predict()函数就是一个很好的工具。

#设置一个新的数据,给定自变量来预测因变量
> x.new <- data.frame (mom.hs=1, mom.iq=100)
> x.new
  mom.hs mom.iq
1      1    100
#对因变量进行预测
> predict (fit.3, x.new, interval="prediction", level=0.95)
       fit      lwr      upr
1 92.62915 81.96868 103.2896

转载:https://blog.csdn.net/tianty1121/article/details/115939805
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场