数学建模社区-数学中国

标题: 用R语言进行简单线性回归分析 [打印本页]

作者: 数模天下    时间: 2012-12-24 14:05
标题: 用R语言进行简单线性回归分析

用R语言进行简单线性回归分析,数据出自何晓群--应用回归分析,语言如下所示:


. Y; ?: m( M( S. j- g2 t6 |  w  E

x y


7 C& M) Q: T- O2 V" ]; R# _

3.4 26.2

1.8 17.8


1 j) c3 l0 L& x

4.6 31.3

2.3 23.1

3.1 27.5

5.5 36

0.7 14.1

3 22.3

) I% L% y0 {+ Y0 ^+ D. Y, r, q+ q9 D

2.6 19.6

4.3 31.3


0 u' E0 y$ h& z: t4 }5 [* g

2.1 24

7 W& X6 q' U( D; t! q+ L

1.1 17.3


9 {9 r; E! V; f/ x! A

6.1 43.2


5 n# p3 S- W6 g  u$ [, s) c4 V

4.8 36.4

' s9 F4 \8 r) G5 u( B, E

3.8 26.1

  m) l2 D& ^: G

#-------------------------------------------------------------#数据准备

fire <- read.table('D:/fire.txt', head = T)

6 U. ]. r7 I2 b) X. I% i% |$ [

#-------------------------------------------------------------#回归分析


) u& Y  G$ M) j0 g" f

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) #学生化残差


  W$ f  h2 k3 w

plot(fire.sre)

abline(h = 0)

$ {2 e. a; f9 G

text(11, fire.sre[11], label = 11, adj = (-0.3), col = 2) #标注点

2 p+ H0 O# a/ T3 z+ t7 z9 q$ f' B

#-------------------------------------------------------------#预测与控制

attach(fire) #连接

6 d/ C  c2 b! T0 m0 C: O5 Y

fire.reg <- lm(y ~ x) #这种回归拟合简单


7 V$ f) P; }& n# L! u0 x$ n! ]% v

fire.points <- data.frame(x = c(3.5, 4))

fire.pred <- predict(fire.reg, fire.points, interval = 'prediction', level = 0.95) #预测:置信区间

fire.pred

detach(fire) #取消连接

( M) j1 p4 L$ o' I1 I

--------------------------------------------------------------------------------------------------

#附自编的过程程序:(R最大的好处是可以自己编想要的程序和函数,尤其没有内置函数的时候)


& T8 g! `6 O1 Q2 `' [" H

fire <- read.table('D:/fire.txt', head = T)

; }% ?2 R/ J& s

attach(fire)

--------------------------------------------


7 f: l3 M* I. q4 {8 \, [5 r

lxy <- function(x){

sum <- 0

; }- p6 S; G6 i5 J  u& q

sum0 <- 0

for(i in 1:length(x)){


5 E# x7 H: B% w6 }

sum0 <- (x - mean(x)) * (y-mean(y))

) b( }# a9 J0 @

sum <- sum + sum0}

. r: B" e) @" i6 i- C! f! M1 l- A3 u

sum}

---------------------------------------------------------------------------------

5 [8 c9 e# e" s

#用这个就不需要循环了


9 e$ r% x5 w; H8 C9 I+ u6 v

lxy <- function(x){

0 [/ u4 b: I$ t: x9 t9 r; k

mid <- (x - mean(x)) * (y-mean(y))


; [. \/ t+ M* `4 |( k2 L' K5 Y

sum <- sum(mid)


4 X$ Y& F2 W. a8 R$ M

sum}

#对于数据框、列表等数据对象要善用apply()函数。

---------------------------------------------------------------------------------

lxx <- function(x){

sum <- 0

sum0 <- 0


" }5 _9 L' h6 D$ a6 M4 A

for(i in 1:length(x)){

0 g- [; n- j% t$ @

sum0 <- (x - mean(x))^2


( `3 S4 I2 q' l5 f  L

sum <- sum + sum0}

& k, p, P' q; P  Q# q, O

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 #决定系数


. t; E1 A5 k, Z$ c

adrsqure <- 1 - ((length(x)-1)/(length(x)-2))*(1-r^2) #调整后的决定系数

----------------------------------------------------------------------------------


# s7 e4 _: K  i* }- \4 L

esrequre <- function(x){ #求标准差平方估计值


5 |0 _* `0 e4 s6 E, |3 S) c8 g

sum <- 0

7 ]) d" L2 A/ T/ y

sum0 <- 0

for(i in 1:length(x)){

- v3 d$ T8 ?* I5 C2 L, j$ U

sum0 <- residu^2

sum <- sum + sum0}


% i5 M7 o0 g4 r# `) M

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


0 x8 H: O* r& x) S. X/ l0 f' X4 I

sum0 <- 0


' V' A1 E6 j) |# n' o

for(i in 1:length(x)){


5 m) e/ X; J8 O/ O! }# c% y$ W

sum0 <- residu^2


4 `2 V" n; j- p4 N

sum <- sum + sum0}


7 p9 U8 v. F' _1 _

sum}


" Q/ ?6 {0 I+ h

SSE <- SSe(x); SSE #残差平方和

  Z4 f( w; k1 M7 X& H8 p* a( Y

MSE <- SSE/(length(x)-2); MSE #残差均方和

SSr <- function(x){

+ A# \# F: ~+ }8 s; T2 D

sum <- 0


1 r# n: P5 s6 }' M3 Y8 Q& ?% h

sum0 <- 0

for(i in 1:length(x)){


% K# d0 U0 \% j6 Z( n

sum0 <- ((b0 + b1*x) - mean(y))^2

sum <- sum + sum0}


: v, v0 o& n# Q7 D0 W. F8 z9 N

sum}

SSR <- SSr(x); SSR #回归平方和


/ t$ g/ r8 f5 ~

MSR <- SSR/1; MSR #回归均方和

4 b0 P3 f. N" p- v5 `! a

val_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 d' Y5 R7 ?: m8 z! q, q

Y <- function(x){b0 + b1 * x} #点估计

Y(3.5)


& g% E- ^. D& i: D( }% ~4 `; r1 }( \9 |* p





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5