数学建模社区-数学中国

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

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

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

8 N$ z! h: O& @# r+ p

x y

; s+ ~8 T3 l# b8 A9 I

3.4 26.2

1.8 17.8


4 p3 s4 O5 q6 X, L

4.6 31.3

2.3 23.1

3.1 27.5

5.5 36

0.7 14.1

3 22.3

0 b- G1 u+ y7 K( ^, t* T

2.6 19.6

4.3 31.3


+ f3 X) [- h% g7 }; D) Y# f

2.1 24

( \6 z4 s+ `8 s2 L$ I4 e3 O* j+ h

1.1 17.3


, A: e# B6 w+ ~3 C& ]+ T

6.1 43.2


: ~- }/ z, u' A- e. [. Y  X

4.8 36.4

; C$ A7 T0 j  R5 l7 H

3.8 26.1


  y. l3 r* _: L& \/ E$ y; B

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

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

) H4 k' o  U4 E7 c% S2 W; ?' r- p

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

  B$ W, M5 S. o; Q) ^4 \9 h. 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) #学生化残差

6 v. n/ @3 |+ G

plot(fire.sre)

abline(h = 0)


: {- E/ d3 O: Q4 l! Z) o3 }

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

+ H. h$ Q6 m' c

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

attach(fire) #连接


) |  Z* Q: L* @  w

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

+ @- @/ C! }3 E+ r1 H, r7 q( i7 {

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

3 c! k- a3 C6 Q; U0 G

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

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

0 ?7 M( l- C$ Q1 V$ H5 I+ N

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


6 s/ |9 C' `1 o+ N

attach(fire)

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


4 E' [/ N5 i* l, X( ]/ x- B

lxy <- function(x){

sum <- 0


2 j  `3 X6 N7 P" X) j9 T4 r) Z+ a

sum0 <- 0

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


, l7 ?$ _9 s3 ]6 Q, @# @+ h

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


1 a8 L# e9 i7 R" f8 v8 S8 P  Z

sum <- sum + sum0}


3 z  l$ @4 Q% A) G; P( p

sum}

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


+ N* c+ X, j, b5 Z4 n% R  W) {! s% r

#用这个就不需要循环了


0 n. l) }3 D  A1 M  Y6 z

lxy <- function(x){


; x7 g5 W  H% g  [2 ]8 ~

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


4 w- g. n: u( Z+ R

sum <- sum(mid)

$ n& b% P" P; ~; u  n  L

sum}

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

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

lxx <- function(x){

sum <- 0

sum0 <- 0


1 C! w1 a6 z( T% H$ R+ k

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


; K& T7 C0 X! d5 a

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

2 l* P2 I! f: z; _, T* Z' W( L1 O8 P7 B

sum <- sum + sum0}


% C! q+ t. {2 t5 M

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


) A/ a  F: U2 R3 J' n2 [+ h, \

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

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


2 q; u5 G7 ~9 R9 j* B

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


8 V- R! R1 `# B* j

sum <- 0

; ~  {9 E% w! N; @9 E4 Z2 U$ r

sum0 <- 0

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


" K  v& {) z9 P$ s% w1 j& N- e; a

sum0 <- residu^2

sum <- sum + sum0}

+ M: i9 h; {3 v. x( t3 W# v9 s

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 ~; c/ u6 ]& }

sum0 <- 0


" V( o) o9 A* K

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


. {& U% m: D! B( b# @

sum0 <- residu^2


, I$ k/ o3 g  J* O

sum <- sum + sum0}


" D) L! I* V7 ?- f9 C

sum}


' B. m/ M- o3 [# g7 h7 W5 n

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

% T0 `+ X- u8 c: f

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

SSr <- function(x){


' X6 ]* {7 }2 ?( g8 C  Q7 n

sum <- 0

! Y9 I- O' b# J0 s

sum0 <- 0

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


  n) M7 z* ]/ e& W

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

sum <- sum + sum0}


% H2 b& i9 o* Z$ U# q

sum}

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


6 N; Z# k4 c5 V

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


4 g$ L8 l: ~6 p* M2 B- C

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


  W& ?( _4 u/ ^9 n0 `

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

Y(3.5)

" d8 f2 w, {1 O+ p9 U6 ]9 z1 {
: k1 s7 \$ a. w; v6 }





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