- 정규성검정
- T검정과 분산분석
- 모수검정과 비모수검정 비교
- 상관분석과 회귀분석
- 다중회귀분석
- 범주형자료분석
귀무가설(null hypothesis)은 우리가 증명하고자 하는 가설의 반대되는 가설, 효과와 차이가 없는 가설을 의미하며 우리가 증명 또는 입증하고자 하는 가설, 효과와 차이가 있는 가설을 대립가설이라고 한다.
귀무가설 H0 : 현재의 가설
대립가설 H1 : 새로운 가설
p값이 0.05보다 작으면 대립가설을 채택! (귀무가설 기각)
setwd('C:\\Users\\Public\\Downloads\\MyFolder')
getwd()
결측치 제거
dat_F<-na.omit(dat)
nrow(dat_F)
a[complete.cases(a),]
data<- read.table('test1.txt')
header=T 컬럼이름 있음.
sep 구분자
data<- read.table('test1.txt',header=T,sep=',')
2,3열만
data<- tmp[, c(2,3)]
ex_data <-read.csv(“C:/Rstudy/data_ex.csv”)
install.packages(‘readxl’)
library(readlxl)
excel_data<- read_excel('test2.xlsx', sheet=2)
data2_1=data2[(data2$A_steps>0 & o2$A_steps<10000), ]
summary(뫄)
hist(뫄)
3450 넘으면 1, 아니면 0
o2_3<-ifelse(o2_1$A_steps>=3450, 1, 0)
1300이하는 1, 1300<=x<5000는 2, 아니면 3
o2_1$A_steps_gr2<-with(o2_1, ifelse(A_steps<1300, 1, ifelse((A_steps>=1300 & A_steps<5000), 2, 3)))
freq(o2_1$A_steps_gr)
merge(x, y, key=??)
r4<- aggregate(r2$A_steps, list(r2$pid), mean)
r4[1:20, ]
dim(r4)
var.test(A_steps ~ sex, data=r3, cof.level = 0.95)
: F-검정. p-value가 0.2052는 0.05보다 크기 때문에 귀무가설 기각 불가. -> 남자와 여자의 퍼진 정도(분산)가 같다.

t.test(A_steps ~ sex, data=r3, var.equal=TRUE, conf.level=0.95)

남자의 평균 걸음수 : 3736.398, 여자의 평균 걸음수 : 3122.812
p-value는 0.001105로 0.05보다 작기 때문에 귀무가설을 기각한다. -> 당뇨 환자인 남자와 여자의 평균 걸음 걸이는 같지 않다. (다르다) -> 남자인 경우가 더 많이 걷는다.(생활 습관을 변하기 위해 더 노력한다)
qqnorm(dat_subj$HE_glu, col='grey')
qqline(dat_subj$HE_glu, col='#377EB8', lwd=2)

공복혈당(HE_glu)에 대한 Q-Q plot이에요.
도트로 표현된 분포는 empirical distribution, 즉 우리가 가진 공복혈당의 분포이고
파란색 선으로 표현된 분포는 theoretical distribution으로, 정규분포입니다.
이 두 분포가 근접하게 분포하면 정규성을 띈다고 할 수 있으며, 근접하지 않으면 정규성을 띄지 않는다고 할 수 있어요.
정규성을 검정하는 방법
H0 귀무가설은 데이터가 정규분포를 따른다.
H1 대립가설은 데이터가 정규분포를 따르지 않는다이다.
p값이 0.05보다 작을 경우, 귀무가설을 기각하고 대립가설을 채택!
즉, 0.05보다 클 경우, 정규분포를 따른다.
shapiro.test(r3$A_steps)

but, 표본 크기가 5000을 넘으면 에러가 발생
비연속적 범주형 자료를 분석함에 있어 연속성 분포인 카이제곱 분포에
적용함으로써 발생하는 확률값의 차이를 보정하는 방법임
H0 (귀무가설): 두 그룹의 분산의 차이가 없다. vs. H1(대립가설): 두 그룹의 분산의 차이가 있다.
var.test(dat_subj$HE_glu ~ dat_subj$DE1_31)

p값이 매우 작다. = 귀무가설을 기각하여 등분산성이 없다, 즉 두 그룹의 분산이 같지 않다고 할 수 있습니다.
정규분포 검사
shapiro.test(r3$A_steps)
변수
연속형 자료 분석
-> 정규성을 만족할 때
two-sample t-test 독립된 두 집단의 모평균 비교
paired t-test 쌍을 이룬 집단에서 모평균의 차이에 대한 검정
1) 단일 표본 t-test (one sample t-test)
- 특정 그룹의 평균이 특정 값과 같은지 비교
- 예: 인슐린 투여 후 공복혈당 수치는 90mg/dL 일 것이다.
2) 독립 표본 t-test (two sample t-test)
- 서로 다른 두 그룹 간의 평균을 비교
- 예: 당뇨환자에서 인슐린 투여군과 비투여군은 혈당의 차이가 있을 것이다.
3) 대응 표본 t-test (paired t-test)
- 한 그룹 내에서 동일한 대상을 반복 측정하여 전과 후 평균을 비교
- 예: 당뇨환자에서 인슐린 투여 전과 후의 혈당 변화는 차이가 있을 것이다.
t.test는 정규성을 만족해야한다! 등분산성 여부를 알아야한다.
- 정규분포를 따르지 않음! 따른다고 가정!
- 인슐린 투여 그룹 간 분산이 다름!
# two sample t-test
t.test(dat_subj$HE_glu ~ dat_subj$DE1_31, paired=F, var.equal=F, conf.level=0.95)
여기서 실행시키기 전에!! 몇 가지 command를 추가해 줄게요.
먼저, 독립 표본 t-test이므로 paired=F를 추가해 줍니다.
대응 표본(paired t-test)인 경우엔 paired=T라는 설정만 바꿔주시면 됩니다.
두 번째로 위에서 등분산성 여부를 파악했었죠?
등분산성을 만족하지 못했기 때문에 var.eqaul=F를 추가해 주시구요.
마지막으로 신뢰구간은 일반적으로 95% 설정하므로 conf.level=0.95까지! 추가해 줍니다.

p-value는 0.1676으로 인슐린 투여 여부에 따라 공복혈당이 다르지 않다고 할 수 있습니다.
one-way ANOVA 세 집단 이상의 모평균 비교
-> 정규성을 만족하지 못할때
t.test의 비모수 버전
wilcox.test(Price ~ Origin, data=dat)

검정 결과 p-value=0.6724입니다. 친절하게 결과 마지막 줄에 대립가설도 나오네요.
대립가설은 중위수 차이는 0이 아니다. 즉, 중심 차이가 있다.인데
p-value가 0.05보다 크기 때문에 생산국(USA/non-USA)에 따른 자동차 가격의 차이는 없다고 할 수 있습니다.
대응표본 paired t.test에 대한 비모수 버전
대응표본 paired=T
wilcox.test(weight ~ group, data=dat2, paired=T)
중위수를 구할 변수 ~ 그룹 변수와 대응표본임을 알려주는 paried=T 옵션을 추가합니다.
P-value=0.006으로 0.05보다 작으므로, 전(before group)과 후(after group)의 체중(weight)에는 차이가 있다고 할 수 있습니다.
ANOVA의 비모수버전
shapiro.test()-> p값이 0.05보다 작다 = 정규성을 띄지 않는다. => 비모수 사용

p-value가 매우 작으므로 실린더 수에 따른 마력의 차이가 있다고 할 수 있습니다.
사례2) H0 (귀무가설) : 모든 집단의 중위수(median)가 같다 vs. HA (대립가설) : 한 집단이라도 중위수(median)가 같지 않다
p-value가 0.05보다 작기 때문에 귀무가설을 기각하고, 대립가설을 채택하게 됩니다. 즉, 한 집단이라도 중위수가 같지 않다는 결과가 나왔고, 이는 선수들 간 경기별 출전 시간 분포(양상)이 한 명이라도 다른 것이 있다는 것을 의미합니다.
범주형 자료 분석
cor.test
cor.test(dat$cyl, dat$hp)
실린더의 수(cyl)와 마력(hp) 간 상관관계가 있는가
: 회귀분석은 한마디로 독립변수와 종속변수 간의 관계를 알아내는 분석
독립변수(영향을 줌)->종속변수(영향을 받음)
독립변수의 상태에 따라, 혹은 독립변수가 증가/감소할수록 종속변수가 증가/감소한다고 해석한다.
(선형회귀분석의 종속변수는 연속형 변수)
lm(종속변수~독립변수(+들), data=데이터셋)
lm_fit <- lm(hp ~ cyl, data=dat)
linear model
R-squared : 적합도 판단
multi_fit <- lm(hp ~ cyl + wt, data=dat)
summary(multi_fit)
plot(x~y, data=데이터)
abline(reg=result1,col="red",lwd=2)
step(res)

AIC가 작을수록 좋음!
(3가지의 설명력은 70.95지만 wt와 vs의 AIC 값은 68, 결국 factor(gear)일 때만 AIC가 낮아졌음을 알 수 있다. 결국 factor(gear)를 뺐을 때가 AIC값이 낮아졌기에 더 좋음을 알 수 있다. 마지막에 factor(gear)를 뺀 회귀계수를 보여줌.
mpg=33-4.4wt+3.2vs
install.packages("car")
library(car)
vif(m)

rowPercents(a3)
colPercents(a3)
install.packages("gmodels")
library(gomodels)
CrossTable(b$obstruct, b$status)

일반횟수
카이 제곱 ( 기대치 비율 )
행을 기준으로 비율 값 ( 가로로 읽는다. )
컬럼을 기준으로 비율 값 ( 세로로 읽는다. )
전체를 기준으로 비율 값
chisq.test(b$obstruct, b$status)

p값이 매우 작은 값이면 x와 y가 관계가 있다고 결론을 내릴 수 있다.
카이제곱은 분산에 대한 추정.
유의하지 않음->귀무가설기각->분산이 같지 않음

로지스틱 회귀분석은 선형 회귀분석과 달리 종속변수(반응변수)가 범주형 변수인 경우에 독립변수와 종속변수 간 관계를 알아내는 데 사용되는 분석방법이다.
logit_fit <- glm(survived ~ ., data=dat_F, family='binomial')
generalized linear model

간단한 해석을 하자면,
남자의 생존확률이 여자의 생존 확률 보다 더 낮고,
연령이 높아질수록 생존 확률이 낮아지며,
2nd class와 3rd class의 생존 확률이 1st class보다 낮다고 할 수 있습니다.
좀 더 자세한 해석을 하자면
남자의 생존확률은 여자의 생존확률의 e-2.497845배이고,
나이가 1살 많아지면 생존확률은 e-0.034393배가 되고,
2nd class는 1st class 생존확률의 e-1.280570배이고,
3rd class는 1st class 생존확률의 e-2.289661배입니다.
################################## categorical data analysis ##################################
# dependent var : status ( recur or death of colorectal cancer =1 )
# independent var :
obstruct : obastruction ��?翡 ???? ???? ????
install.packages("survival")
library(survival)
str(colon)
View(colon)
library(descr)
b<-colon
#1. categorical variable : frequency
a1<-freq(b$status)
a1
View(a1)
a2<-freq(b$obstruct)
a2
View(a2)
a3<-table(b$obstruct, b$status)
a3
View(a3)
install.packages("Rcmdr")
library(Rcmdr)
rowPercents(a3)
colPercents(a3)
a4<-CrossTable(b$obstruct, b$status)
a4
#2. chi-sqaure test
chisq.test(b$obstruct, b$status)
# dependent var : status ( recur or death of colorectal cancer =1 )
# independent var :
obstruct : obastruction ��?翡 ???? ???? ????
perfor : perforation ???? õ??
adhere : adherence ??��???????? ��??
nodes : number of lymphatic gland ?ϼ????? Ȯ?ε? ?????? ??
differ : ?ϼ????? ��?????? ??ȭ��??(1=well, 2=moderate, 3=poor)
extent : ?ϼ????? ħ???? ???? (1=submucosa, 2=muscle, 3=serosa, 4=adjacent organ)
surg : time until registration after surgery (0=short, 1=long)
freq(b$obstruct)
freq(b$perfor)
freq(b$adhere)
freq(b$nodes) # NA's 36
hist(b$nodes)
summary(b$nodes)
hist(b$nodes, breaks=seq(0,35, by=1))
freq(b$differ) # NA's 46
freq(b$extent)
freq(b$surg)
#2. chi-sqaure test
CrossTable(b$obstruct, b$status)
chisq.test(b$obstruct, b$status)
CrossTable(b$perfor, b$status)
chisq.test(b$perfor, b$status)
CrossTable(b$adhere, b$status)
chisq.test(b$adhere, b$status)
CrossTable(b$differ, b$status)
chisq.test(b$differ, b$status)
CrossTable(b$extent, b$status)
chisq.test(b$extent, b$status)
CrossTable(b$surg, b$status)
chisq.test(b$surg, b$status)
# continuous var -> categorical var
b$nodes_gr=ifelse(b$nodes>2,1,0)
CrossTable(b$nodes_gr, b$status)
chisq.test(b$nodes_gr, b$status)
###### logistic regression model #########################################
# GLM (Genelized Linear Model)
result = glm(status~ sex + age + obstruct + perfor + adhere + nodes + differ +
extent + surg, family=binomial, data=b)
summary(result)
dim(b)
data1<-na.omit(colon)
dim(data1)
# sample = data1
result = glm(status~ sex + age + obstruct + perfor + adhere + nodes + differ +
extent + surg, family=binomial, data=data1)
summary(result)
# differ, extent => gr
result = glm(status~ sex + age + obstruct + perfor + adhere + nodes +
factor(differ) +
factor(extent) + surg, family=binomial, data=data1)
summary(result)
step(result)
step(result, direction="backward")
step(result, direction="forward")
m=step(result, direction="backward")
summary(m)
m=step(result, direction="forward")
m=step(result, direction="both")
# Odds Ratio
ORtable = function(x, digits=2){
suppressMessages(a<-confint(x))
result=data.frame(exp(coef(x)),exp(a))
result=round(result,digits)
result=cbind(result, round(summary(x)$coefficient[,4],3))
colnames(result)=c("OR", "2.5%", "97.5%", "p")
result
}
ORtable(m)
# sex + age + obstruct + perfor + adhere + nodes + differ + extent + surg
result = glm(status ~ obstruct , family=binomial, data=b)
summary(result)
ORtable(result)
result = glm(status ~ adhere , family=binomial, data=b)
summary(result)
ORtable(result)
result = glm(status ~ nodes , family=binomial, data=b)
summary(result)
ORtable(result)
result = glm(status ~ factor(extent) , family=binomial, data=b)
summary(result)
ORtable(result)
result = glm(status ~ surg , family=binomial, data=b)
summary(result)
ORtable(result)
# visualization of Odds Ratio
install.packages("moonBook")
library(moonBook)
odds_ratio = ORtable(m)
odds_ratio = odds_ratio[2:nrow(odds_ratio),]
HRplot(odds_ratio, type=2, show.CI=TRUE, cex=2)
