数学建模社区-数学中国

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

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

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

9 t" v! Q- L: z( S' h

x y

3 k6 o( b* y& b+ D5 h/ [* U7 \! p4 @

3.4 26.2

1.8 17.8

5 M* O, V9 }6 ~" C/ F( O$ y8 ^

4.6 31.3

2.3 23.1

3.1 27.5

5.5 36

0.7 14.1

3 22.3


) Y6 u! K% f8 K' [$ @

2.6 19.6

4.3 31.3

' P: C% ]! l2 T" F1 A2 m

2.1 24

2 G. T2 M. s) I+ \' S/ z

1.1 17.3


* O3 I) I" H/ v9 d. a, P6 P

6.1 43.2


7 k* |  b- ~$ x1 q- C3 F7 m5 S$ [

4.8 36.4


  R% f9 I* A5 Y- k1 I1 M* Q6 A1 l, l9 m, l

3.8 26.1


6 ~" [8 B6 m% H+ t7 C* Y

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

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

  j2 N6 r+ j$ i+ L- h

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


* [  P, T& K/ S5 C! d. d

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

5 H* P, x- B; J( P& K

plot(fire.sre)

abline(h = 0)

+ |8 l# ~1 ?( w" u2 Q! p0 [) V

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


) ~# {3 h1 C" ~  W  Z- [

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

attach(fire) #连接


. Q+ d; }/ ^6 {

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

; J2 K4 R! X. p

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) #取消连接

" Y2 w6 H+ D6 J+ F- X

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

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

. |. E4 o( J" y. x$ }

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


9 N; M& }, h! e% x

attach(fire)

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

- [  G7 }1 C+ F

lxy <- function(x){

sum <- 0

% p% x% n$ K: c0 ^+ F  K* ~1 y

sum0 <- 0

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


8 h, ^. |) W3 \9 K7 r

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

! K( e6 p. X% X' u

sum <- sum + sum0}

! K3 l6 w4 e; z5 e

sum}

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


) F- K9 \2 ~# N4 x! f, }4 z

#用这个就不需要循环了


' N5 O8 h) [0 e, D, K' c

lxy <- function(x){


7 [) x8 z) O0 X+ |# J

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


- D" L( w/ n7 o+ N  N  v

sum <- sum(mid)

. Z) j& v: i0 o3 O& ?: K2 G

sum}

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

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

lxx <- function(x){

sum <- 0

sum0 <- 0

5 @2 k2 |# L5 Z$ `

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


6 F  R: F3 K2 V% A# B

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


- b7 l) M+ D- z6 b2 h# h# L( G" e9 l

sum <- sum + sum0}


% S1 t! J' O+ D- w* q0 o/ V6 h' r

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

3 ?+ ~" b0 `. D4 ?  R6 U

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

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


4 a& K3 ~/ H. c3 \3 @4 y

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

/ A) x4 X+ i) l' Y

sum <- 0

; C3 X3 R( g- w9 f$ y

sum0 <- 0

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


( ]3 L& h9 s9 E# w5 R3 a

sum0 <- residu^2

sum <- sum + sum0}

0 `) c: K4 Y" Z- P9 b( _1 |

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


1 L, b; ^3 P! }4 ]& k

sum0 <- 0

; g/ |& g& i1 @% X1 K* B" S

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


9 s. i, S5 k0 Q9 v, }

sum0 <- residu^2


0 a3 i2 x% F+ u0 t

sum <- sum + sum0}

4 _& k3 d+ J. N

sum}

" {$ ?, a% y6 I/ h6 b" N& @, T6 ~" K

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

: {& h$ R1 a4 l. b8 |: q

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

SSr <- function(x){


, x! y3 y+ v( e

sum <- 0


0 y9 `$ i% l- S9 c; X- K

sum0 <- 0

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


7 X8 l8 ]: o8 Z& F

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

sum <- sum + sum0}


+ v  \4 [! |( I1 d& d, U

sum}

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


  K: J% D" l* Y! e1 z) Y8 D

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

8 y- j( ~3 R* o- M% n

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

0 j% i" c3 M% C% q

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

Y(3.5)


! Z* V  Y0 G, {3 T
/ b$ {" }' \/ t4 Y- ?: t5 H2 I$ C




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