数学建模社区-数学中国

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

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

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

$ x& @" c( k9 n) j8 D" _/ X

x y

0 p8 l1 I0 [& k  p

3.4 26.2

1.8 17.8


. B- g, X7 L/ |) O

4.6 31.3

2.3 23.1

3.1 27.5

5.5 36

0.7 14.1

3 22.3


/ A0 r' R# Q% W6 N2 ^5 S8 d

2.6 19.6

4.3 31.3


7 h8 L) m  e4 p3 r' u# D+ X# |

2.1 24


5 F( }+ j1 _; a+ x5 w

1.1 17.3

& m- h3 \' V! N* u2 k

6.1 43.2


1 a/ q' f  g  U. D2 E) N9 s' C

4.8 36.4

0 G- _! D0 B( O6 _7 K+ [4 t7 Z

3.8 26.1

2 r7 \9 z' L! }7 w; V) G1 @

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

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


1 s: x7 k8 l5 r: T" T# K8 \: t; E  }

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


+ e+ e% K2 u' s1 i+ K

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


3 [' z4 r# ?* s* D

plot(fire.sre)

abline(h = 0)

2 y4 N! P2 {9 F

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

4 L8 M8 V% L- E' C/ S

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

attach(fire) #连接

- X8 k. r; t6 u6 p5 r( J

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


  K- j* G; w% |1 {; Q6 }

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


( G9 t% n% N( @9 f+ G& f9 J

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

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


- k' y! G1 ?4 C5 x/ z

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


2 x" R0 _* N4 w4 ]7 o1 U6 a1 l6 R

attach(fire)

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

) g  a6 v8 u- v+ ~/ \/ r

lxy <- function(x){

sum <- 0

. v6 K4 h; b& i1 L0 W) g

sum0 <- 0

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

) a1 z( ?. ~. N4 H$ G0 o7 `/ G

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

% }+ Y+ x0 Y) B3 Q

sum <- sum + sum0}

! s5 Z0 @& Q1 a9 q+ m

sum}

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


( N1 L4 [  G2 B& x

#用这个就不需要循环了

; ~8 J9 E3 N3 L% Y  k+ D

lxy <- function(x){

$ w2 @5 v5 n9 i7 T- v( Q$ ?$ [

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


0 [9 B! x- S8 s2 |! \

sum <- sum(mid)

3 ?5 O& l, {/ @' O0 \, n, L: N

sum}

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

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

lxx <- function(x){

sum <- 0

sum0 <- 0

' i+ g# F: ~8 j! Z2 Z9 i# r

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

" H( ]9 G4 U7 I" S# x% }

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

, P. X! L: W! v) d! c  E

sum <- sum + sum0}

$ {7 E' w1 ^8 y

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


9 _% f. |2 U" t, [8 e

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

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

+ \- Q3 v+ V: U1 y, X

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

3 y5 _3 |- q' Z2 U

sum <- 0


1 b0 D8 s# m5 k. q0 G: z

sum0 <- 0

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

. q: e7 z2 }) n8 H6 f, v6 Z' v

sum0 <- residu^2

sum <- sum + sum0}


& Y6 t! b9 b' T1 E( 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


6 w, T9 T+ e- f/ ]; R  }

sum0 <- 0

/ ?+ o6 L" w  a6 ~+ u0 j9 X- p

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


  g2 H; l! W. v! B

sum0 <- residu^2

* N- L. Z8 A, S2 P, c

sum <- sum + sum0}

( R+ h- K; V0 L. q* l' o; g

sum}


! F6 g* {6 [6 Z# n9 N: }

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


6 X' H1 z/ V) T* L: }. N9 f7 v

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

SSr <- function(x){


* D) Z+ W# Z1 s" g6 W

sum <- 0

6 Z4 D& v, R( _4 F/ I

sum0 <- 0

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


& z7 A+ k: D2 x% L  V1 _7 P( V* a

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

sum <- sum + sum0}

% |3 `( O6 w; H% b, O: ~

sum}

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


/ q/ I/ p( u, d0 H& z

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

: I/ ^. {) M0 m3 j8 Q& f

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

/ ?6 h0 P  y! B  n9 e" ~9 a+ \7 D

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

Y(3.5)

: e% v$ o9 c  U' H( R
4 B4 |! ]) u' x





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