用R语言进行简单线性回归分析,数据出自何晓群--应用回归分析,语言如下所示:
x y
3.4 26.2
1.8 17.8
0 T0 ?4 J5 S, v _4.6 31.3
2.3 23.1
3.1 27.5
5.5 36
0.7 14.1
3 22.3
2.6 19.6
4.3 31.3
2.1 24
3 J& i8 @- L, h: o; M/ O1.1 17.3
6.1 43.2
4.8 36.4
8 b* s5 s- c2 w- j ^3.8 26.1
2 A+ i! {! v7 h, [% A7 f: e( f0 ^#-------------------------------------------------------------#数据准备
fire <- read.table('D:/fire.txt', head = T)
#-------------------------------------------------------------#回归分析
plot(fire$y ~ fire$x)
fire.reg <- lm(fire$y ~ fire$x, data = fire) #回归拟合
summary(fire.reg) #回归分析表
anova(fire.reg) #方差分析表
abline(fire.reg, col = 2, lty = 2) #拟合直线
#-------------------------------------------------------------#残差分析
fire.res <- residuals(fire.reg) #残差
fire.sre <- rstandard(fire.reg) #学生化残差
8 S( }* N# e8 C8 J# }" o3 k* cplot(fire.sre)
abline(h = 0)
6 x3 n+ N# r4 b2 X/ ^3 @text(11, fire.sre[11], label = 11, adj = (-0.3), col = 2) #标注点
#-------------------------------------------------------------#预测与控制
attach(fire) #连接
5 f7 v6 D U n" X5 vfire.reg <- lm(y ~ x) #这种回归拟合简单
6 y( @% n# A9 S& G- d/ Bfire.points <- data.frame(x = c(3.5, 4))
fire.pred <- predict(fire.reg, fire.points, interval = 'prediction', level = 0.95) #预测:置信区间
fire.pred
detach(fire) #取消连接
--------------------------------------------------------------------------------------------------
#附自编的过程程序:(R最大的好处是可以自己编想要的程序和函数,尤其没有内置函数的时候)
- V6 M9 s0 [% @& x$ u7 k* Ifire <- read.table('D:/fire.txt', head = T)
) }2 x O9 z0 u8 c5 Z6 @/ Mattach(fire)
--------------------------------------------
% t& i/ w* T1 l% E6 {9 Q( zlxy <- function(x){
sum <- 0
4 w: @# v0 ~5 W& Hsum0 <- 0
for(i in 1:length(x)){
) b# g/ W9 A: h; J8 @sum0 <- (x - mean(x)) * (y-mean(y))
sum <- sum + sum0}
sum}
---------------------------------------------------------------------------------
% M9 f6 t( t& d+ b8 T#用这个就不需要循环了
+ a3 v& Q' d& A4 {) G _lxy <- function(x){
( `4 f+ E5 ~+ I4 H0 ]mid <- (x - mean(x)) * (y-mean(y))
0 {& B7 S6 _! q& l# Zsum <- sum(mid)
2 P& O0 h y* ]8 b& D1 q* R6 Esum}
#对于数据框、列表等数据对象要善用apply()函数。
---------------------------------------------------------------------------------
lxx <- function(x){
sum <- 0
sum0 <- 0
for(i in 1:length(x)){
sum0 <- (x - mean(x))^2
( n j& X5 s9 G( `; rsum <- sum + sum0}
sum}
Lxx <- lxx(x)
Lyy <- lxx(y)
Lxy <- lxy(x)
b1 <- Lxy / Lxx; b1 #回归系数斜率
b0 <- mean(y) - b1 * mean(x); b0 #回归系数截距
residu <- y - (b0 + b1*x); residu #残差
r <- Lxy / sqrt(Lxx * Lyy); r #相关系数
rsqure <- r^2; rsqure #决定系数
adrsqure <- 1 - ((length(x)-1)/(length(x)-2))*(1-r^2) #调整后的决定系数
----------------------------------------------------------------------------------
/ ^0 R, c- b$ e& K# V. N6 mesrequre <- function(x){ #求标准差平方估计值
7 q. T" }: s& j& {/ u* j7 m0 qsum <- 0
sum0 <- 0
for(i in 1:length(x)){
7 {6 Y" G; Y5 u0 \& `* C3 asum0 <- residu^2
sum <- sum + sum0}
residusqure <- sum/(length(x)-2)
residusqure}
esterreq <- esrequre(x); esterreq #标准差平方估计值(MSE)
ester <- sqrt(esrequre(x)); ester #标准差估计值(回归分析表给出的标准误差)
val_t <- b1*sqrt(Lxx) / ester; val_t #检验回归系数斜率b1的t值
SSe <- function(x){ #求残差平方和
sum <- 0
T3 P3 D0 b7 qsum0 <- 0
+ x9 g. [& O P0 I! \0 Vfor(i in 1:length(x)){
sum0 <- residu^2
) s# W3 t7 C/ ?4 ?7 [0 ssum <- sum + sum0}
2 M3 @) }4 D; e5 ^( d7 W3 m/ X7 Gsum}
SSE <- SSe(x); SSE #残差平方和
. @. f* u: j O0 X9 g1 P, mMSE <- SSE/(length(x)-2); MSE #残差均方和
SSr <- function(x){
sum <- 0
sum0 <- 0
for(i in 1:length(x)){
& }6 w8 Y1 A' P" L5 usum0 <- ((b0 + b1*x) - mean(y))^2
sum <- sum + sum0}
! G6 `$ h& z9 ]1 \1 W7 ^5 psum}
SSR <- SSr(x); SSR #回归平方和
% A" V# _7 m: A' F0 g3 _# W5 Z/ Y5 IMSR <- SSR/1; MSR #回归均方和
9 y( A# f) f5 W- Y- a7 Bval_F <- SSR / MSE; val_F #检验回归方程F值
hi <- 1/length(x) + (x-mean(x))^2/Lxx #杠杆值
ZRE <- residu / ester; ZRE #标准化残差
SRE <- residu/(ester*sqrt(1-hi)); SRE #学生化残差
5 C0 `6 Q* C7 E. I u4 B- }Y <- function(x){b0 + b1 * x} #点估计
Y(3.5)
: g8 ^' d! h5 S8 k# u- G9 d| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |