====== 하나의 독립변인이 갖는 고유의 영향력 혹은 설명력 파악하기 ====== [[:multiple regression]] 참조 [[:partial and semipartial correlation]] 참조 datavar <- read.csv("http://commres.net/wiki/_media/regression01-bankaccount.csv") datavar colnames(datavar) <- c("y", "x1", "x2") datavar attach(datavar) library(ggplot2) # ggplot 사용을 위해서 # install.packages("ggplot2") lm.y.x1 <- lm(y~x1, data=datavar) summary(lm.y.x1) str(lm.y.x1) intercept.y <- lm.y.x1$coefficients[1] slope.x <- lm.y.x1$coefficients[2] intercept.y slope.x ggplot(data=datavar, aes(x1,y)) + geom_point(color="blue", size=1.5, pch=2) + geom_hline(aes(yintercept=mean(y)), size=1.5, color="red") + geom_abline(intercept=intercept.y, slope=slope.x, size=1.5, color="darkgreen") # recapping ss.tot <- var(y)*(length(y)-1) ss.tot ss.res <- sum(lm.y.x1$residuals^2) ss.res ss.reg <- sum((lm.y.x1$fitted.values-mean(y))^2) ss.reg ss.tot ss.res + ss.reg summary(lm(lm.y.x1$residuals~x1)) summary(lm((lm.y.x1$fitted.values~x1))) summary(lm((lm.y.x1$fitted.values-mean(y))~x1)) # recapping ends lm.y.x2 <- lm(y~x2, data=datavar) summary(lm.y.x2) intercept.y <- lm.y.x2$coefficients[1] slope.x <- lm.y.x2$coefficients[2] intercept.y slope.x ggplot(data=datavar, aes(x2,y)) + geom_point(color="blue", size=1.5, pch=2) + geom_hline(aes(yintercept=mean(y)),size=1.5, color="red") + geom_abline(intercept=intercept.y, slope=slope.x, size=1.5, color="darkgreen") lm.y.x1x2 <- lm(y~x1+x2, data=datavar) summary(lm.y.x1x2) ################################## res.lm.y.x2 <- resid(lm.y.x2) # y - x2 # x2를 제외하기 위한 계산 lm.x1.x2 <- lm(x1~x2, data=datavar) res.lm.x1.x2 <- resid(lm.x1.x2) # x1 - x2 lm(res.lm.y.x2~res.lm.x1.x2) summary(lm(res.lm.y.x2~res.lm.x1.x2)) # x2를 y, x1에서 모두 제외한 분석 # or cor(res.lm.y.x2, res.lm.x1.x2) # cor제곱 값은 x2의 설명력을 제어 혹은 제외한 후에 보는 # y와 x1간의 r 제곱값이다 cor(res.lm.y.x2, res.lm.x1.x2)^2 summary(lm(res.lm.y.x2~res.lm.x1.x2))$r.squared ############################ # http://commres.net/wiki/partial_and_semipartial_correlation 문서 확인할 것 # install.packages("ppcor") library(ppcor) pcor(datavar) datavar # data 확인 pcor.test(y, x1, x2) # x2제어 하고, y와 x1과의 correlation값을 묻는 펑션 summary(lm(res.y.minus.x2~res.x1.minus.x2)) r.sq <- (summary(lm(res.lm.y.x2~res.lm.x1.x2)))$r.squared r.sq sqrt(r.sq) # 같은 논리로 semi-partial을 살펴보면 공통 영향력의 크기를 # 알아낼 수 있다. sp.y.x1 <- spcor.test(y, x1, x2) sp.y.x2 <- spcor.test(y, x2, x1) b <- sp.y.x1$estimate^2 c <- sp.y.x2$estimate^2 b c temp.bc <- b + c temp.bc summary(lm.y.x1x2)$r.squared # b+c+d / a+b+c+d common.area <- summary(lm.y.x1x2)$r.squared - temp.bc common.area # common.area가 맞는지 확인 # b + common.area는 lm(y~x1,data=datavar)에서의 r.square 값이어야 한다 summary(lm.y.x1)$r.squared b + common.area # 마찬가지로 c + common.area should be the same as # summary(lm.y.x2)$r.squared summary(lm.y.x2)$r.squared c + common.area ====== 기울기 b에 대한 통계학적인 테스트 ====== [[:multiple regression]]에서 앞 쪽에 기울기에 대한 테스트 부분 regression 문서에서 [[:regression#eg_3_simple_regressionadjusted_r_squared_slope_test]] 부분 ################################################ # standard error of coefficient의 의미 # b의 사선을 중심으로 에러의 분포가 정규분포를 # 이룬다고 할 때, 그 때의 standard error 값. # 따라서, fitted.value +- 2 * se 값이 에러의 # 범위를 (range) 알려주는 방법. # 단, 2 = t critical value로 대체해야 ################################################ summary(lm.y.x1x2) mean(y) mean(x1) mean(x2) intercept <- lm.y.x1x2$coefficients[1] b1 <- lm.y.x1x2$coefficients[2] b2 <- lm.y.x1x2$coefficients[3] intercept b1 b2 ggplot(datavar,aes(x = x1, y = y)) + geom_point() + geom_smooth(method = "lm") ggplot(datavar,aes(x = x2, y = y)) + geom_point() + geom_smooth(method = "lm") summary(lm.y.x1) a <- lm.y.x1$coefficients[1] b <- lm.y.x1$coefficients[2] # y hat = a + b x1 # x1 = 200 ? p <- as.data.frame(200) p colnames(p) <- "x1" p predict(lm.y.x1, newdata=p) lm.y.x1$coefficients pred <- predict(lm.y.x1,newdata=p) summary(lm.y.x1) t.critical <- qt(.975,9) t.critical (summary(lm.y.x1))$coefficients # coefficient 값 중 독립변인의 se값은 $coefficient[4] # 절편의 se는 [3] se.x1 <- (summary(lm.y.x1))$coefficients[4] se.x1 pred.range.down <- pred - (t.critical*se.x1) pred.range.up <- pred + (t.critical*se.x1) pred.range.down pred.range.up summary(lm.y.x2) a <- lm.y.x2$coefficients[1] b <- lm.y.x2$coefficients[2] a b # y hat = a + b x2 # x2 = 5 명일때? p <- as.data.frame(5) colnames(p) <- "x2" lm.y.x2$coefficients pred <- predict(lm.y.x2,newdata=p) pred t.critical <- qt(.975,9) t.critical se.x2 <- (summary(lm.y.x2))$coefficients[4] se.x2 lim <- t.critical*se.x2 pred.range.down <- pred-lim pred.range.up <- pred+lim pred.range.down pred.range.up # or pred.range <- pred + c(-lim, lim) pred.range # Note that the range depends upon the se value summary(lm.y.x1) summary(lm.y.x2) summary(lm.y.x1x2) dvar <- read.csv("http://commres.net/wiki/_media/elemapi2_.csv", sep = "\t", fileEncoding="UTF-8-BOM") mod1 <- lm(api00 ~ ell + acs_k3 + avg_ed + meals, data=dvar) mod2 <- lm(api00 ~ ell + avg_ed + meals + acs_k3, data=dvar) mod3 <- lm(api00 ~ meals + acs_k3 + avg_ed + ell, data=dvar) summary(mod1) summary(mod2) summary(mod3) anova(mod1) anova(mod2) anova(mod3)