====== Correlation and Regression: What's My Line? ====== ---- {{:b:head_first_statistics:pasted:20221209-084247.png}} {{:b:head_first_statistics:pasted:20221209-084400.png}} ---- {{:b:head_first_statistics:pasted:20221209-084452.png}} ---- {{:b:head_first_statistics:pasted:20221209-084611.png}} > s <- c(1.9,2.5,3.2,3.8,4.7,5.5, 5.9, 7.2) > c <- c(22,33,30,42,38,49,42,55) > plot(s,c) > df <- data.frame(s,c) > df s c 1 1.9 22 2 2.5 33 3 3.2 30 4 3.8 42 5 4.7 38 6 5.5 49 7 5.9 42 8 7.2 55 > plot(df) {{:b:head_first_statistics:pasted:20221209-084904.png}} ---- {{:b:head_first_statistics:pasted:20221209-085024.png}} {{:b:head_first_statistics:pasted:20221209-085102.png}} ===== Predict values with a line of best fit ===== {{:b:head_first_statistics:pasted:20221209-085250.png}} \begin{align} b = & \frac{\Sigma{(x-\overline{x})(y-\overline{y})}}{\Sigma{(x-\overline{x})^2}} \nonumber \\ = & \frac{SP}{SS_{x}} \\ a = & \overline{y} - b \; \overline{x} \;\;\; \because \; \overline{y} = a + b \; \overline{x} \end{align} > # lm = linear modeling (lm function) > # = regression > # = correlation > mod <- lm(c~s, data=df) > summary(mod) Call: lm(formula = c ~ s, data = df) Residuals: Min 1Q Median 3Q Max -5.2131 -3.0740 -0.9777 3.9237 5.9933 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 15.7283 4.4372 3.545 0.01215 * s 5.3364 0.9527 5.601 0.00138 ** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 4.571 on 6 degrees of freedom Multiple R-squared: 0.8395, Adjusted R-squared: 0.8127 F-statistic: 31.37 on 1 and 6 DF, p-value: 0.001379 ===== Correlation ===== Textbook says: \begin{align} r = & b * \frac {sd(x)}{sd(y)} \\ = & b * \sqrt{\frac {SS_X} {SS_Y}} \;\;\; \because \left(b = \frac {SP}{SS_X} \right) \nonumber \\ = & \frac {SP}{SS_X} * \frac {\sqrt{SS_X}} {\sqrt{SS_Y}} \nonumber \\ = & \frac {SP}{\sqrt{SS_X * SS_Y}} \nonumber \\ = & \frac {COV}{SD(X) SD(Y)} \end{align} [[:Regression]] page says: \begin{eqnarray} R^2 & = & \frac{\text{SS}_{reg}}{\text{SS}_{total}} \\ & = & \frac{ \text{SS}_{total} - \text{SS}_{res}} {\text{SS}_{total}} \nonumber \\ & = & 1 - \frac{\text{SS}_{res}} {\text{SS}_{total}} \\ \end{eqnarray} \begin{eqnarray*} & \text{Note that (1), (2) are the same.} \nonumber \\ & \text{Therefore,} \nonumber \\ & r = \sqrt{R^2} \\ \end{eqnarray*} We, from [[:correlation]] wiki page, also addressed that r (correlation coefficient value) can be obtained through \begin{eqnarray*} r & = & \frac {Cov(x,y)} {sd(x)*sd(y)} \\ \end{eqnarray*} see [[:correlation#pearson_s_r]] 아래는 위의 세 가지 방법으로 R에서 r 값을 구해본 것이다. # check the coefficient from the lm analysis b <- summary(mod)$coefficients[2,1] b df sd.x <- sd(df$s) sd.y <- sd(df$c) # 첫 번째 r.value1 <- b * (sd.x/sd.y) r.value1 # 두 번째 # rsquared r.value2 <- sqrt(summary(mod)$r.squared) r.value2 # or cov.sc <- cov(df$s, df$c) r.value3 <- cov.sc/(sd.x*sd.y) r.value3 아래는 위의 아웃풋 > # check the coefficient from the lm analysis > b <- summary(mod)$coefficients[2,1] > b [1] 5.336411 > df s c 1 1.9 22 2 2.5 33 3 3.2 30 4 3.8 42 5 4.7 38 6 5.5 49 7 5.9 42 8 7.2 55 > sd.x <- sd(df$s) > sd.y <- sd(df$c) > > # 첫 번째 > r.value1 <- b * (sd.x/sd.y) > r.value1 [1] 0.9162191 > > # 두 번째 > # rsquared > r.value2 <- sqrt(summary(mod)$r.squared) > r.value2 [1] 0.9162191 > > # or > cov.sc <- cov(df$s, df$c) > r.value3 <- cov.sc/(sd.x*sd.y) > > r.value3 [1] 0.9162191 > ===== exercise ===== # correlation 에 대한 이해를 돕기 위한 연습 # stat first 책에서 radiation exposure 양과 # (독립변인) weight 간의 관계 (종속변인) # # 두 변인 (독립변인과 종속변인) 모두 # 숫자로 측정된 변인 re <- c(4, 4.5, 5, 5.5, 6, 6.5, 7) we <- c(12, 10, 8, 9.5, 8, 9, 6) # 손으로 variance, standard deviation 구하기 # 우선 각각의 평균 mean.re <- mean(re) mean.we <- mean(we) mean.re mean.we # sum of square x (ssx) 와 ssy 구하기 ss.re <- sum((re-mean.re)^2) ss.we <- sum((we-mean.we)^2) ss.re ss.we # df 값은 df <- length(we)-1 df # variance와 sd var.re.1 <- ss.re/df var.we.1 <- ss.we/df sd.re.1 <- sqrt(var.re.1) sd.we.1 <- sqrt(var.we.1) # R의 펑션을 이용해서 구하기 var.re <- var(re) var.we <- var(we) sd.re <- sd(re) sd.we <- sd(we) var.re.1 var.we.1 var.re var.we sd.re.1 sd.we.1 sd.re sd.we # sum of product sp <- sum((re-mean.re)*(we-mean.we)) cov.rewe.1 <- sp/df cov.rewe <- cov(re,we) sp cov.rewe.1 cov.rewe # 교재에 기술된 # r, b, r square # r = cov(x,y)/(sd(x)*sd(y)) # = sp / sqrt(ss(x)*ss(y)) r.val <- sp / (sqrt(ss.re*ss.we)) r.val2 <- cor(re,we) r.val r.val2 # 기울기 b = sp / ss(x) b <- sp / ss.re b a <- mean.we - (b * mean.re) a # r 제곱값 (r^2) r.sq <- r.val^2 r.sq # 위의 모든 정보가 lm function의 결과에 m1 <- lm(we~re) summary(m1) ## summary(m1)에서 se가 나타나는 부분 설명 # se of regression = sqrt of mse # p = # of parameters (IVs) # p <- 1 n <- length(we) n df.res <- n-p-1 # or m1$df.residual # residual 값들을 제곱해서 모두 더한 후 # n으로 (df.residual값으로) 나누준 것 # = 분산을 구하는 형식이다. 즉 아래는 # regression line으로 예측하고 남은 # 나머지 오차들에 (residuals) 대한 분산값 # 이것을 mean square error라고 부른다 # variance를 mean square라고 부르는 사람들이 # 있다. # ss of square residuals = ssres ssres <- sum(m1$residuals^2) # ssres = sum of square error 값으로 부르기도 # 한다. sse <- ssres mse <- sse/df.res mse # 그리고 그 값에 sqrt값을 씌워 sd값을 # stanard deviation 구한다. 이것을 # root mean square error라고 부른다. rmse <- sqrt(mse) rmse # summary(m1)에서 Residual standard error: 1.177 # 에 해당하는 값 summary(m1) # b coefficient 에 대한 standard error 값은 # sqrt( (1/(n-2)) * (sse/ssx)) se.b <- sqrt( (1/(n-2)) * (sse/ss.re) ) se.b # 아래 아웃풋에서 Std. Error 참조 summary(m1) c <- qt(.975, 5) se.b2 <- c*se.b b - se.b2 b + se.b2 confint(m1) > # correlation 에 대한 이해를 돕기 위한 연습 > # stat first 책에서 radiation exposure 양과 > # (독립변인) weight 간의 관계 (종속변인) > # > # 두 변인 (독립변인과 종속변인) 모두 > # 숫자로 측정된 변인 > re <- c(4, 4.5, 5, 5.5, 6, 6.5, 7) > we <- c(12, 10, 8, 9.5, 8, 9, 6) > > # 손으로 variance, standard deviation 구하기 > # 우선 각각의 평균 > mean.re <- mean(re) > mean.we <- mean(we) > mean.re [1] 5.5 > mean.we [1] 8.928571 > > # sum of square x (ssx) 와 ssy 구하기 > ss.re <- sum((re-mean.re)^2) > ss.we <- sum((we-mean.we)^2) > ss.re [1] 7 > ss.we [1] 21.21429 > > # df 값은 > df <- length(we)-1 > df [1] 6 > # variance와 sd > var.re.1 <- ss.re/df > var.we.1 <- ss.we/df > sd.re.1 <- sqrt(var.re.1) > sd.we.1 <- sqrt(var.we.1) > # R의 펑션을 이용해서 구하기 > var.re <- var(re) > var.we <- var(we) > sd.re <- sd(re) > sd.we <- sd(we) > > var.re.1 [1] 1.166667 > var.we.1 [1] 3.535714 > var.re [1] 1.166667 > var.we [1] 3.535714 > sd.re.1 [1] 1.080123 > sd.we.1 [1] 1.88035 > sd.re [1] 1.080123 > sd.we [1] 1.88035 > > > # sum of product > sp <- sum((re-mean.re)*(we-mean.we)) > cov.rewe.1 <- sp/df > cov.rewe <- cov(re,we) > sp [1] -10 > cov.rewe.1 [1] -1.666667 > cov.rewe [1] -1.666667 > > > # 교재에 기술된 > # r, b, r square > # r = cov(x,y)/(sd(x)*sd(y)) > # = sp / sqrt(ss(x)*ss(y)) > r.val <- sp / (sqrt(ss.re*ss.we)) > r.val2 <- cor(re,we) > r.val [1] -0.8206099 > r.val2 [1] -0.8206099 > > # 기울기 b = sp / ss(x) > b <- sp / ss.re > b [1] -1.428571 > a <- mean.we - (b * mean.re) > a [1] 16.78571 > # r 제곱값 (r^2) > r.sq <- r.val^2 > r.sq [1] 0.6734007 > > # 위의 모든 정보가 lm function의 결과에 > m1 <- lm(we~re) > summary(m1) Call: lm(formula = we ~ re) Residuals: 1 2 3 4 5 6 7 0.9286 -0.3571 -1.6429 0.5714 -0.2143 1.5000 -0.7857 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 16.7857 2.4872 6.749 0.00108 ** re -1.4286 0.4449 -3.211 0.02371 * --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 1.177 on 5 degrees of freedom Multiple R-squared: 0.6734, Adjusted R-squared: 0.6081 F-statistic: 10.31 on 1 and 5 DF, p-value: 0.02371 > > ## summary(m1)에서 se가 나타나는 부분 설명 > # se of regression = sqrt of mse > # p = # of parameters (IVs) > # > p <- 1 > n <- length(we) > n [1] 7 > df.res <- n-p-1 > # or > m1$df.residual [1] 5 > > # residual 값들을 제곱해서 모두 더한 후 > # n으로 (df.residual값으로) 나누준 것 > # = 분산을 구하는 형식이다. 즉 아래는 > # regression line으로 예측하고 남은 > # 나머지 오차들에 (residuals) 대한 분산값 > # 이것을 mean square error라고 부른다 > # variance를 mean square라고 부르는 사람들이 > # 있다. > # ss of square residuals = ssres > ssres <- sum(m1$residuals^2) > # ssres = sum of square error 값으로 부르기도 > # 한다. > sse <- ssres > mse <- sse/df.res > mse [1] 1.385714 > > # 그리고 그 값에 sqrt값을 씌워 sd값을 > # stanard deviation 구한다. 이것을 > # root mean square error라고 부른다. > rmse <- sqrt(mse) > rmse [1] 1.177164 > > # summary(m1)에서 Residual standard error: 1.177 > # 에 해당하는 값 > summary(m1) Call: lm(formula = we ~ re) Residuals: 1 2 3 4 5 6 7 0.9286 -0.3571 -1.6429 0.5714 -0.2143 1.5000 -0.7857 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 16.7857 2.4872 6.749 0.00108 ** re -1.4286 0.4449 -3.211 0.02371 * --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 1.177 on 5 degrees of freedom Multiple R-squared: 0.6734, Adjusted R-squared: 0.6081 F-statistic: 10.31 on 1 and 5 DF, p-value: 0.02371 > > # b coefficient 에 대한 standard error 값은 > # sqrt( (1/(n-2)) * (sse/ssx)) > se.b <- sqrt( (1/(n-2)) * (sse/ss.re) ) > se.b [1] 0.444926 > # 아래 아웃풋에서 Std. Error 참조 > summary(m1) Call: lm(formula = we ~ re) Residuals: 1 2 3 4 5 6 7 0.9286 -0.3571 -1.6429 0.5714 -0.2143 1.5000 -0.7857 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 16.7857 2.4872 6.749 0.00108 ** re -1.4286 0.4449 -3.211 0.02371 * --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 1.177 on 5 degrees of freedom Multiple R-squared: 0.6734, Adjusted R-squared: 0.6081 F-statistic: 10.31 on 1 and 5 DF, p-value: 0.02371 > > c <- qt(.975, 5) > se.b2 <- c*se.b > b - se.b2 [1] -2.57229 > b + se.b2 [1] -0.2848526 > confint(m1) 2.5 % 97.5 % (Intercept) 10.39213 23.1792968 re -2.57229 -0.2848526 > ===== exercise 2: 직접해보기 ===== 아래에서처럼 데이터를 R에서 다운로드 받아서 정리한 후에 위에서처럼 sp, ss.x, ss.y, b, a, r, r squared, 등등을 구해 보시오. ######################## dat <- read.csv("http://commres.net/wiki/_media/regression01-bankaccount.csv") # data # bankaccount = 통장갯수 # income = 수입 # famnum = 부양가족수 # IV = 수입 = income # DV = 통장갯수 = bankaccount # # 컬럼 이름 바꾸기 (간단하게) colnames(dat) <- c("y", "x", "x2") dat attach(dat) dat # ss.y # ss.x # df.y # df.x # sp.xy # sd.x # sd.y # b coefficient # b # a intercept # a # pred <- a + b*x # resid <- y - pred # ss.pred # ss.resid # ss.y # r # r.sq