数学建模社区-数学中国

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

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

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


" q1 R9 c2 X  Z

x y

, \" T- T& m. Q$ t% \- S% r

3.4 26.2

1.8 17.8


: y  l+ z7 y5 r8 `% {8 D

4.6 31.3

2.3 23.1

3.1 27.5

5.5 36

0.7 14.1

3 22.3


8 j9 N7 p- r. l. o; ?0 U. e

2.6 19.6

4.3 31.3


% L$ b& z$ Z; V/ s0 Y& h6 N2 i

2.1 24


& K9 j# k" h# @6 u8 O: x4 }/ K

1.1 17.3


9 K9 G  T: F9 H0 T1 e9 h: S

6.1 43.2


* v+ |3 W) Q0 Y7 L2 T0 q

4.8 36.4

% h- Y9 b# X+ X% O4 M+ c9 g& S

3.8 26.1

1 |7 k) v' c$ w& W. r; s: C, ]

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

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


/ `7 F; I8 ^- q4 V4 l9 C+ A, k0 ?

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


+ e6 `7 o. y4 i

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

* V* ~# y: i' |5 `$ e( t

plot(fire.sre)

abline(h = 0)


9 v& j) S$ j" p* I" m; i/ L% U

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


  M/ u2 j+ @' D. `  j: U8 j  L

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

attach(fire) #连接

3 F" K+ ~7 \$ B* D6 j

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


1 _2 L; o( U" P/ R0 w6 |

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


0 C/ p9 x" R! n: H. `. G' v

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

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


# L# ^2 R( @1 i/ o: `

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


. V$ v& j% y! e4 L! _

attach(fire)

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


  t; u3 @& I% v1 ~) p

lxy <- function(x){

sum <- 0


- Q9 f2 ^  d1 O9 h

sum0 <- 0

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

! E- {- R& r+ m8 [/ x

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


9 T$ |  o+ s+ g# E' p

sum <- sum + sum0}


, O, A. x/ s+ H9 p

sum}

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


) \* m) c/ ]; L4 D

#用这个就不需要循环了


5 K' w: j& q. N# ^

lxy <- function(x){


1 ?9 w0 p; d! [  }

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

! M) G" B9 v$ N; b

sum <- sum(mid)


; F7 ^7 Z. g5 ?% l, N

sum}

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

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

lxx <- function(x){

sum <- 0

sum0 <- 0

- [# N+ e9 g% u( f! H  c# b! z

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

. X! r  S" t+ M  h9 f3 g. c

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


" B  e0 F3 r/ |0 ^% S: j2 w: ]

sum <- sum + sum0}


# P+ {4 _1 J& u2 ^! U/ B. Z5 C

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


! F$ @7 h5 n; l0 N3 X. M, b! O

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

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

0 W! x  @7 D4 g$ w% B+ _/ t# k

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


9 H3 x; X7 p" I8 e& G

sum <- 0

8 M+ ?" Z5 ^: E7 I

sum0 <- 0

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


, J5 u3 Y  o4 i

sum0 <- residu^2

sum <- sum + sum0}

6 t( i$ V2 {* j9 P: G( d

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 [) ^" \6 c& F9 Z+ o! f

sum0 <- 0

& m8 G! N) t/ s8 {, d

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


+ c4 [" t( @6 [) @, j

sum0 <- residu^2


: f( O6 }0 k9 y* x3 H" |9 v

sum <- sum + sum0}


( l9 R  t# h! P7 Q/ h9 W% G$ m$ a

sum}

% v8 V- q! e. B) b+ ~/ F

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


& ?% s9 [, ?1 ~# h* j2 B  P4 A

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

SSr <- function(x){

9 r7 s8 `7 S  c- Z

sum <- 0


. X0 [* C$ E6 [! J& _! `

sum0 <- 0

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


# D2 K" [2 b- T3 u

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

sum <- sum + sum0}


1 Y0 O4 ~7 P- J. P8 r

sum}

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


* W7 m  {9 L- T8 o0 v$ B& M5 e8 j

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


6 ^% s# X5 P. N7 G

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 W, H2 c" ~( |% u& }

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

Y(3.5)

8 _+ m1 z; Z4 `7 m$ E  @2 w) ~
8 P/ {4 |* t6 `% v; P





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