#데이터셋age<-c(3.0,4.0,5.0,6.0,8.0,9.0,10.0,11.0,12.0,14.0,15.0,16.0,17.0)wing_length<-c(1.4,1.5,2.2,2.4,3.1,3.2,3.2,3.9,4.1,4.7,4.5,5.2,5.0)ex17_1<-data.frame(age,wing_length)ex17_1%>%kbl(caption="Dataset of Example 17.1")%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
Dataset of Example 17.1
age
wing_length
3
1.4
4
1.5
5
2.2
6
2.4
8
3.1
9
3.2
10
3.2
11
3.9
12
4.1
14
4.7
15
4.5
16
5.2
17
5.0
해당 데이터는 참새의 나이와 날개의 길이를 측정한 데이터이다.
이 데이터를 사용하여 연령과 날개 길이의 회귀직선을 그려보도록 한다.
library("ggplot2")ggplot(ex17_1,aes(x=age,y=wing_length))+geom_point(color="#8dd3c7",size=4)+stat_smooth(method='lm',color="#ffffb3")+ggtitle("Example 17.1 : Sparrow wing length as a function of age")+ylab("Wing Length Y.in cm")+xlab("Age. X. in days")+theme_bw()
EXAMPLE 17.2
EXAMPLE 17.1 데이터로 Machine formula를 사용하여 회귀식을 구하도록 한다.
f_17_2<-function(x){n<-nrow(x)sum_x<-sum(x[,1])mean_x<-mean(x[,1])sum_y<-sum(x[,2])mean_y<-mean(x[,2])sum_x2<-sum(x[,1]^2)sum_xy<-sum(x[,1]*x[,2])b<-(sum_xy-((sum_x*sum_y)/n))/(sum_x2-(sum_x^2)/n)a<-mean_y-b*mean_xout<-data.frame(n,sum_x,mean_x,sum_y,mean_y,sum_x2,sum_xy,b,a)return(out)}f_17_2(ex17_1)%>%kbl(caption="Result of simple linear regression equation",escape=F)%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
Result of simple linear regression equation
n
sum_x
mean_x
sum_y
mean_y
sum_x2
sum_xy
b
a
13
130
10
44.4
3.415385
1562
514.8
0.270229
0.7130945
회귀식을 추정한 결과 \(\hat Y = 0.715+0.270X\) 로 도출되었다.
Example 17.1에서 구한 회귀직선에 식을 넣으면 다음과 같다.
ggplot(ex17_1,aes(x=age,y=wing_length))+geom_point(color="#8dd3c7",size=4)+stat_smooth(method='lm',color="#ffffb3")+ggtitle("Example 17.2 : Sparrow wing length as a function of age with simple linear regression equation")+ylab("Wing Length Y.in cm")+xlab("Age. X. in days")+theme_bw()+geom_text(x=15,y=4,label=expression(hat(Y)==paste(0.715," + ",0.270,X," ",)),cex=5)
EXAMPLE 17.3
앞서 구한 회귀식의 ANOVA table을 작성하여 추정한 회귀식의 유의성을 판단하여 보겠다.
summ<-summary(lm17_2)data.frame(summ$r.squared,summ$adj.r.squared)%>%rename("R square"="summ.r.squared","Adjusted R square"="summ.adj.r.squared")%>%kable(caption="R square",booktabs=TRUE,valign='t')%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
회귀직선의 유의성을 판단한 결과, F값은 401.09, p-value<0.001 이므로 \(H_0: \beta_1=0\)은 기각되었다. 따라서 유의수준 5%하에 회귀직선은 유의하다고 할 수 있다.
결정계수 값은 0.97로, 총변동중에서 회귀직선에 의해 설명되는 부분이 97%임을 확인하였다.
EXAMPLE 17.4
EXAMPLE 1,2에 사용된 데이터를 가지고 회귀계수의 유의성 검정을 하기 위해 t-test를 진행해 보도록 하겠다.
직접 함수를를 작성하여 구하여 보겠다.
f_17_4<-function(x){alpha<-0.05n<-nrow(x)estimate<-f_17_2(x)$br2<-summ$r.squaredsyx2<-(sd(x[,2])*sqrt((1-r2)*(13-1)/(13-2)))^2sum_x2<-sum(x[,1]^2)-(sum(x[,1])^2)/nse<-sqrt(syx2/sum_x2)t<-estimate/secrit<-qt(1-alpha/2,n-2)pvalue<-pt(t,n-2,lower.tail=F)if(pvalue<0.05){Reject_H0<-"yes"}else{Reject_H0<-"No"}out<-data.frame(n,estimate,se,t,pvalue,Reject_H0)return(out)}f_17_4(ex17_1)%>%kbl(caption="Result of t test",escape=F)%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
회귀계수의 유의성 검정 결과 age에 대한 coefficient 값은 0.2702290, t 값은 20.02 이며 p-value<0.001 로써 유의수준 0.05보다 작아 귀무가설을 기각할 충분한 근거를 가진다. -그러므로 유의수준 5%하에 회귀계수는 유의하다고 할 수 있다.
Equation a)를 사용하였을 때 13일 살의 새의 날개 길이의 모평균의 95% 신뢰구간은 [4.065, 4.386] 이며, b)를 사용했을 떄는 [4.005, 4.445] 그리고, c)를 사용했을 때는 [3.719, 4.731]이다.
EXAMPLE 17.6
Estimated Y Value에 대하여 검정을 진행하여 보겠겠다.
\[\begin{aligned} H_0 &: The \ mean \ population \ wing \ length \ of \ 13.0-day-birds \ is \ not \ greater \ than \ 4cm \\ H_A &: The \ mean \ population \ wing \ length \ of \ 13.0-day-birds \ is \ greater \ than \ 4cm \end{aligned}\]
library("chemCal")inverse_result<-inverse.predict(lm17_2,4.5)inverse_result<-as.data.frame(inverse_result)inverse_result[2,1:3]<-"."inverse_result%>%kbl(caption="Result of Inverse Prediction",escape=F)%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
Result of Inverse Prediction
Prediction
Standard.Error
Confidence
Confidence.Limits
14.0136897001304
0.862343975232319
1.89800629238076
12.11568
.
.
.
15.91170
위의 결과를 보아 날개의 길이가 4.5cm라고 주어졌을 때, 예상되는 새의 나이의 값은 14.013이고, 이에 대한 95% 신뢰구간은 [12.115, 15.911] 이다.
EXAMPLE 17.8a
#데이터셋age<-c(rep(30,3),rep(40,4),rep(50,3),rep(60,5),rep(70,5))sbp<-c(108,110,106,125,120,118,119,132,137,134,148,151,146,147,144,162,156,164,158,159)ex17_8<-data.frame(age,sbp)ex17_8%>%kbl(caption="Dataset of Example 17_8a",escape=F)%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
summary(lm17_8)[4]%>%as.data.frame%>%rename("Estimate"="coefficients.Estimate","Standard Error"="coefficients.Std..Error","t value"="coefficients.t.value","Pr(>F)"="coefficients.Pr...t..")%>%kable(caption="Test of Coefficients",booktabs=TRUE,valign='t')%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
Test of Coefficients
Estimate
Standard Error
t value
Pr(\>F)
(Intercept)
68.784906
2.2160746
31.03907
0
age
1.303145
0.0407667
31.96590
0
회귀계수의 유의성 검정 결과 검정통계량 t값은 31.039, p-value<0.001이므로 유의수준 0.05보다 작아 귀무가설을 기각할 충분한 근거를 갖는다.
그러므로 유의수준 5%하에 회귀계수는 유의하다고 할 수 있다.
추정된 회귀식은 \(\hat Y_{ij}=68.78+1.303X_{ij}\) 이다.
회귀선을 그려보면 다음과 같다.
ggplot(ex17_8,aes(x=age,y=sbp))+geom_point(color="#8dd3c7",size=4)+stat_smooth(method='lm',color="#ffffb3")+ggtitle("Example 17.8 : A regression whewe there are multiple values of Y for each value of X")+ylab("Symbolic Blood Pressure Y.in mm Hg")+xlab("Age. X. in days")+theme_bw()+geom_text(x=60,y=160,label=expression(hat(Yij)==paste(68.78," + ",1.303,Xij," ",)),cex=7)
EXAMPLE 17.8b
EXAMPLE 17.8a에서 구한 회귀모형의 선형성 검정을 위해 적합결여 F-test 를 수행하도록 하겠다.
선형성 검정을 하기 위해서는 단순 선형모형을 고려한 축소모형과 설명변수 각각의 값들을 factor화 하여 적합한 모형인 전체모형을 구한 뒤 Reduced model과 Full model 사이의 분산분석을 통하여 선형성을 검정한다.
적합결여 검정 결과 검정통계량 F값은 0.07, p-value=0.975 이므로 유의수준 0.05보다 커 귀무가설을 기각할 충분한 근거를 가지고있지 않다.
그러므로 유의수준 5%하에 모 회귀모델은 선형성을 따른다고 할 충분한 근거가 있다고 할 수 있다.
EXAMPLE 17.9
#데이터셋X<-c(rep(5,4),rep(10,4),rep(15,4),rep(20,4),rep(25,4))Y<-c(10.72,11.22,11.75,12.31,14.13,14.79,15.49,16.22,18.61,19.50,20.40,21.37,24.55,25.70,26.92,28.18,32.36,33.88,35.48,37.15)ex17_9<-data.frame(X,Y)ex17_9%>%kbl(caption="Dataset of Example 17_9",escape=F)%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
Dataset of Example 17_9
X
Y
5
10.72
5
11.22
5
11.75
5
12.31
10
14.13
10
14.79
10
15.49
10
16.22
15
18.61
15
19.50
15
20.40
15
21.37
20
24.55
20
25.70
20
26.92
20
28.18
25
32.36
25
33.88
25
35.48
25
37.15
원 데이터와 로그변환한 데이터 간의 차이를 확인해보도록 하겠다.
로그변환
log_y<-log(Y,base=10)ex17_9_trans<-data.frame(X,log_y)ex17_9_trans%>%kbl(caption="Logarithmic transformation Dataset of Example 17_9",escape=F)%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
Logarithmic transformation Dataset of Example 17_9
par(mfrow=c(1,2))plot(X,Y,pch=16,las=1,xlab="X",ylab="Y",ylim=c(0,40),xlim=c(0,25),main="The original data",cex.main=1,col="#8f7450")abline(coef(ex17_9_result1),lwd=2,col="orange")plot(X,log_y,pch=16,las=1,xlab="X",ylab="Y",ylim=c(1.0,1.6),xlim=c(0,25),main="The data after transformation",cex.main=1,col="#8f7450")abline(coef(ex17_9_result2),lwd=2,col="orange")
par(mfrow=c(1,2))plot(X,ex17_9_result1$residuals,xlab="X",ylab="residuals",main="The original data",cex.main=1,pch=16,col="#8dd3c7")plot(X,ex17_9_result2$residuals,xlab="X",ylab="residuals",main="The data after transformation",cex.main=1,pch=16,col="#8dd3c7")
par(mfrow=c(1,2))qqnorm(ex17_9_result1$residuals,main="The original data",cex.main=1,pch=16,col="#8dd3c7")qqnorm(ex17_9_result2$residuals,main="The data after transformation",cex.main=1,pch=16,col="#8dd3c7")
데이터를 로그변환하였을 때 더 강한 선형성을 가짐을 알 수 있다.
그리고 로그변환하였을 때의 잔차의 절대값이 변환 전보다 크게 줄었음을 알 수 있다.
origin<-c(var(Y[ex17_9$X==5]),var(Y[ex17_9$X==10]),var(Y[ex17_9$X==15]),var(Y[ex17_9$X==20]),var(Y[ex17_9$X==25]))logtrans<-c(var(log_y[ex17_9_trans$X==5]),var(log_y[ex17_9_trans$X==10]),var(log_y[ex17_9_trans$X==15]),var(log_y[ex17_9_trans$X==20]),var(log_y[ex17_9_trans$X==25]))variance<-data.frame(origin,logtrans)variance%>%kbl(caption="Variance of each of original data set Logarithmic transformation",escape=F)%>%kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"))
Variance of each of original data set Logarithmic transformation