34.통계데이터분석 - 일반선형모델 - 다항 로지스틱회귀분석.Rmd
0.02MB

 

34.일반선형모델---페널티-로지스틱회귀분석.html
1.40MB

 

https://www.youtube.com/watch?v=4ibxb0OpgWA&list=PLY0OaF78qqGAxKX91WuRigHpwBU0C2SB_&index=35

  • 목표: 다항 로지스틱회귀분석 이해

1. 다항 로지스틱회귀분석 개요

  • 다항 로지스틱회귀분석은 예측변수로부터 3개 이상의 사건, 즉 3개 이상의 범주를 갖는 결과변수의 사건발생확률을 예측함
  • 결과변수가 기업의 신용등급을 나타내고 신용등급은 a, b, c일3개 범주를 갖는다고 했을 때, 예측변수를 바탕으로 신용등급이 a일 확률, b일 확률, c일 확률을 예측함
  • 이렇게 계산된 사건발생확률은 새로운 케이스의 소속범주를 예측하는데 활용할 수 있음
    • 신용등급이 a일 확률, b일 확률, c일 확률을 각각 비교해 가장 큰 확률값을 갖는 범주로 기업신용등급을 예측함

2. 다항 로지스틱회귀모델

  • g개의 가능한 범주가 있을 때 다항로지스틱회귀모델은 아래와 같은 수식으로 표현할 수 있음
    • 결과변수 y는 g개의 가능한 값을 가짐. 즉, g개의 가능한 사건/범주를 가짐
    • k를 사건이라 할 때, \(p_k\)는 사건발생 확률을 나타냄
      • 즉, 결과변수 y가 사건 k일[범주 k에 속할] 확률 (\(p[y=k]\))을 뜻함
    • \(p_1\)은 기준 범주인 사건1 발생확률을 나타냄
      • 즉, 결과변수 y가 사건 1일[범주 1에 속할] 확률 (\(p[y=1]\))을 뜻함
    • 기준 범주는 일반적으로 첫 번째, 마지막, 또는 가장 많은 빈도를 갖는 범주가 사용됨
      • 이 경우는 첫 번째 범주가 기준범주로 사용됨
  • \[ \ln\left ( \frac{p_k}{p_1} \right ) = \beta_{0k} + \beta_{1k}x_{1} + \beta_{2k}x_{2} + \cdots + \beta_{mk}x_{m}\quad(k=2,3,\dots,g) \]
  • g개 범주가 있을 때 g-1개의 다항 로지스틱회귀모델이 생성됨
    • 이 회귀식에서 k는 2부터 g까지의 값을 가짐
    • 따라서 이 수식은 g-1개의 회귀식을 나타냄
    • 여기서 기준 범주로 사용되고 있는 첫 번째 범주를 제외한 나머지 각 범주당 하나씩 기준 범주에 대한 로그오즈 를 설명하는 회귀모델로 정의됨
      • 예로 결과변수가 신용등급이고 그 신용등급의 범주가 a, b, c일 때 다항 로지스틱회귀분석을 수행하면 2개의 회귀식이 생성됨. 기준 범주를 신용등급 a라고 했을 때,
      • 신용등급 b대 신용등급 a를 로그오즈(\(\ln\left ( \frac{p_k}{p_1} \right )\))로 하는 종속변수로하는 회귀식이 1개 생성되고,
      • 신용등급 c대 신용등급 a를 로그오즈(\(\ln\left ( \frac{p_k}{p_1} \right )\))로 하는 종속변수로하는 회귀식이 1개 생성됨
  • 이러한 다항 로지스틱회귀모델 양변에 지수함수를 취해 p에 대해서 정리하면 아래와 같은 각 범주별 사건발생 확률을 구할 수 있음

\[ p_k = P[y=k] = \frac{e^{z_h}}{1+\sum_{h=2}^{g}e^{z_h}}\quad(k=2,3,\dots,g) \]

\[여기에서,\; z_k = \beta_{0k} + \beta_{1k}x_{1} + \beta_{2k}x_{2} + \cdots + \beta_{mk}x_{m}\quad(k=2,3,\dots,g) \]

  • 기준범주 발생확률은 아래와 같다.

\[ p_1 = P[y=1] = \frac{e^{z_h}}{1+\sum_{h=2}^{g}e^{z_h}} \]

  • 이렇게 계산된 확률값은 새로운 케이스의 소속범주를 예측하는데 활용할 수 있음
  • 새로운 케이스에 대해 각 범주별 발생확률을 예측한 후 가장 큰 확률을 나타내는 범주로 분류

3. 다항 로지스틱회귀분석 수행절차

3-1. 활용데이터 분석

  • EffectStars패키지에 PID데이터셋 설명
    • 미국의 유권자 944명의 정치성향 데이터로 모두 6개 변수를 포함하고 있음
    • 6개 변수 중 PID변수는 유권자 정치성향을 나타내는 변수로 다항 로지스틱회귀모델 구축 시 결과변수로 사용할 예정임
library(EffectStars)
data(PID)
str(PID)
## 'data.frame':    944 obs. of  6 variables:
##  $ TVnews    : int  7 1 7 4 7 3 7 1 7 0 ...
##  $ PID       : Factor w/ 3 levels "Democrat","Independent",..: 3 1 1 1 1 1 1 2 2 1 ...
##  $ Income    : num  1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 ...
##  $ Education : Factor w/ 2 levels "low","high": 1 2 2 2 2 2 2 2 2 1 ...
##  $ Age       : int  36 20 24 28 68 21 77 21 31 39 ...
##  $ Population: int  0 190 31 83 640 110 100 31 180 2800 ...
  • PID변수 범주
    • 유권자의 정치 성향은 “Democrat” “Independent” “Republican”로 구분돼 있음
    • 나머지 5개 변수는 유권자 특성 변수로
      • TVnews: 유권자가 지난 일주일간 tv뉴스를 시청한 일수를 나타냄
      • Income: 소득을 나타냄
      • Education: 교육수준을 나타내며, “low”,“high”두 가지 범주로 구분돼 있음
      • Age: 유권자의 나이를 나타냄
      • Population: 유권자가 살고 있는 지역의 인구가 기록돼 있음
  • 이 5가지 유권자 특성으로 유권자가 특정정치성향을 가질 확률을 예측할 것임
levels(PID$PID)
## [1] "Democrat"    "Independent" "Republican"
  • 여기서는 VGAM패키지 vglm()으로 다항 로지스틱회귀분석을 수행함

3-2. 예측모델 생성 - vglm(결과변수 ~ ., family=multinomial())

  • vglm() 인수설명
    • 1st: 결과변수와 예측변수를 포뮬러 형식으로 지정함
    • family: 결과변수의 확률분포를 나타내는 함수를 지정함. 여기서 결과변수는 다항분포를 따르고 있기 때문에 다항분포를 의미하는 multinomial을 지정함
    • data: 예측모델을 생성할 때 사용할 데이터셋을 지정함. 여기서 훈련/테스트데이터 별도 구분없이 전체 데이터셋을 모두 예측모델을 생성하는데 사용함
library(VGAM)
pid.mlogit <- vglm(PID ~ ., family=multinomial(), 
                   data=PID)
summary(pid.mlogit)
## 
## Call:
## vglm(formula = PID ~ ., family = multinomial(), data = PID)
## 
## Coefficients: 
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept):1    1.2296119  0.3031106   4.057 4.98e-05 ***
## (Intercept):2    0.1275830  0.3405777   0.375  0.70795    
## TVnews:1         0.0440935  0.0321897   1.370  0.17075    
## TVnews:2         0.0247123  0.0350497   0.705  0.48077    
## Income:1        -0.0165464  0.0027760  -5.960 2.51e-09 ***
## Income:2        -0.0002418  0.0027864  -0.087  0.93085    
## Educationhigh:1 -0.2886055  0.1759813  -1.640  0.10101    
## Educationhigh:2 -0.3530642  0.1971199  -1.791  0.07328 .  
## Age:1           -0.0077751  0.0052743  -1.474  0.14044    
## Age:2           -0.0066722  0.0059864  -1.115  0.26503    
## Population:1     0.0002592  0.0000984   2.634  0.00844 ** 
## Population:2     0.0002052  0.0001053   1.949  0.05135 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Names of linear predictors: log(mu[,1]/mu[,3]), log(mu[,2]/mu[,3])
## 
## Residual deviance: 1969.38 on 1876 degrees of freedom
## 
## Log-likelihood: -984.6901 on 1876 degrees of freedom
## 
## Number of Fisher scoring iterations: 4 
## 
## No Hauck-Donner effect found in any of the estimates
## 
## 
## Reference group is level  3  of the response
  • 결과해석
    • 다항 로지스틱회귀분석은 결과변수가 g개의 범주를 가질 경우, g-1개의 모델을 추정함
    • 결과변수인 정치성향 변수인 PID는 3개의 범주를 포함하기 때문에 회귀모델 2개가 생성됨
    • 2개의 절편과 각 변수당 2개씩의 회귀계수가 출력됨
    • 여기서 교육수준 변수인 Education은 범주형 변수이기 때문에 모델 내에서 더미변수로 자동변환돼 low는 기준범주로써 0, high는 1로 코딩되고 원래 변수명에 1로 코딩된 범주명 high가 붙여져 Eudcationhigh로 만들어졌음
    • vglm()은 결과변수의 마지막 범주를 기준범주로 사용함. 그래서 PID변수의 마지막 범주 Republican이 기준범주로 사용됨
  • Republican이 기준범주이므로 추정된 2개의 회귀모델은 Republican에 대한 나머지 두 범주의 로그오즈를 각 예측변수의 회귀계수의 선형결합으로 표현할 수 있음

\[ \displaystyle \begin{align*} & \ln\left ( \frac{P(PID = Democrat)}{P(PID = Republican)} \right ) = \\ & 1.230 + 0.044 × TVnews - 0.017 × Income \\ & - 0.289 × Educationhigh - 0.008 × Age + 0.0003 × Population & \end{align*} \]

\[ \displaystyle \begin{align*} & \ln\left ( \frac{P(PID = Independent)}{P(PID = Republican)} \right ) = \\ & 0.128 + 0.025 × TVnews - 0.0002 × Income \\ & - 0.356 × Educationhigh - 0.007 × Age + 0.0002 × Population & \end{align*} \]

  • 각 예측변수의 회귀계수는 다른 독립변수들이 일정하다는 가정 하에 해당 예측변수의 1단위증가가 가져오는 로그오즈의 변화량을 나타냄
    • \(\ln\left ( \frac{P(PID = Democrat)}{P(PID = Republican)} \right )\)회귀모델에서
    • 뉴스시청일수 1일 증가에 로그오즈 0.044만큼 증가
    • 교육수준 1단위 증가(low > high로 변화를 의미)에 로그오즈 0.289만큼 감소
    • 소득 1단위 증가에 로그오즈는 0.017만큼 감소
  • 하지만 로그오즈는 그 자체로 해석상의 어려움이 있기 때문에 다항 로지스틱회귀모델 양변에 지수함수를 취해 결과변수를 로그오즈가 아닌 오즈로 변환함
    • 결과변수가 오즈인 회귀모델에서는 새롭게 계산된 회귀계수로 예측변수 1단위 증가에 따른 오즈의 변화비율을 살펴볼 수 있음
    • 오즈의 변화비율 즉 오즈비는 다른 예측변수가 동일하다는 가정하에 예측변수 1단위 증가시 어떤 한 범주에 속할 확률이, 기준범주에 속할 확률 대비 몇 배나 큰 지 혹은 작은지를 의미함

3-3. 회귀계수 추출 및 지수함수 변환 - exp(coef())

  • 회귀모델의 회귀계수를 지수함수값으로 변환하기 위해 먼저 coef()로 회귀모델로부터 회귀계수를 추출한 다항 회귀계수에 exp함수를 적용함
summary(pid.mlogit)
## 
## Call:
## vglm(formula = PID ~ ., family = multinomial(), data = PID)
## 
## Coefficients: 
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept):1    1.2296119  0.3031106   4.057 4.98e-05 ***
## (Intercept):2    0.1275830  0.3405777   0.375  0.70795    
## TVnews:1         0.0440935  0.0321897   1.370  0.17075    
## TVnews:2         0.0247123  0.0350497   0.705  0.48077    
## Income:1        -0.0165464  0.0027760  -5.960 2.51e-09 ***
## Income:2        -0.0002418  0.0027864  -0.087  0.93085    
## Educationhigh:1 -0.2886055  0.1759813  -1.640  0.10101    
## Educationhigh:2 -0.3530642  0.1971199  -1.791  0.07328 .  
## Age:1           -0.0077751  0.0052743  -1.474  0.14044    
## Age:2           -0.0066722  0.0059864  -1.115  0.26503    
## Population:1     0.0002592  0.0000984   2.634  0.00844 ** 
## Population:2     0.0002052  0.0001053   1.949  0.05135 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Names of linear predictors: log(mu[,1]/mu[,3]), log(mu[,2]/mu[,3])
## 
## Residual deviance: 1969.38 on 1876 degrees of freedom
## 
## Log-likelihood: -984.6901 on 1876 degrees of freedom
## 
## Number of Fisher scoring iterations: 4 
## 
## No Hauck-Donner effect found in any of the estimates
## 
## 
## Reference group is level  3  of the response
exp(coef(pid.mlogit))
##   (Intercept):1   (Intercept):2        TVnews:1        TVnews:2        Income:1 
##       3.4199020       1.1360792       1.0450800       1.0250202       0.9835898 
##        Income:2 Educationhigh:1 Educationhigh:2           Age:1           Age:2 
##       0.9997582       0.7493078       0.7025321       0.9922550       0.9933500 
##    Population:1    Population:2 
##       1.0002592       1.0002052
  • 결과해석
    • 숫자 1은 “Democrat” 대 “Republican” 회귀모델이며, 숫자 2는 “Independent” 대 “Republican” 회귀모델임
    • 오즈비는
      • TVnews: 1.0450800, 뉴스시청일이 1일 늘어날 때 Democrat일 가능성이 Republican일 가능성에 비해 4.5% 증가함
      • Education: 0.7493078, 교육수준 1단위 증가는 Democrat일 가능성이 Republican일 가능성에 비해 25.1% 감소함. 즉, 교육수준이 low->high로 바뀌면 Democrat일 가능성이 Republican일 가능성에 비해 25.1% 작아짐
        • 그런데 TVnews와 Education변수 회귀계수의 p값이 각각 0.17075과 0.10101로 통계적으로 유의하지 않아 이러한 비율은 해석할 때 주의가 필요함
      • Income: 0.9835898, 소득 1단위 증가는 Democrat일 가능성이 Republican일 가능성에 비해 1.6% 감소하며 통계적으로도 유의하므로 소득 변화는 Democrat일 가능성과 Republican일 가능성에 유의한 영향을 미침

3-4. 각 범주별 예측확률 산출 - fitted()

  • 다항 로지스틱회귀모델에 의한 각 범주별 예측 확률은 fitted()로 구할 수 있음
pid.mlogit.pred <- fitted(pid.mlogit)
head(pid.mlogit.pred)
##    Democrat Independent Republican
## 1 0.6247928   0.1932306  0.1819766
## 2 0.5739020   0.1817883  0.2443097
## 3 0.6109039   0.1745194  0.2145766
## 4 0.5843473   0.1772105  0.2384421
## 5 0.5839453   0.1694467  0.2466080
## 6 0.5856824   0.1794368  0.2348808
  • 결과해석: 각 케이스 별 Democrat, Independent, Republican로 분류할 확률이 추정됨

3-5. 새로운 데이터셋에 대한 사건발생확률 추정 - predict()

  • fitted()로 추정한 확률은 예측모델 생성을 위해 사용한 데이터셋에 포함된 각 케이스별 사건발생확률을 의미함
  • 새로운 데이터셋에 대한 사건발생확률을 추정하기 위해서는 predict() 사용
    • 1st: 다항 로지스틱회귀모델 지정
    • newdata: 사건발생확률을 추정할 새로운 데이터셋을 지정함
    • type: 결과를 확률로 출력하기 위해 “response” 를 입력함
  • newdata의 데이터셋 생성 - data.frame()
    • predict()를 실행하면 newdata인수에 지정된 데이터셋의 각 케이스별 사건발생확률을 얻을 수 있으나 현재 모든 데이터를 예측모델 생성에 사용하여 새 데이터셋을 가지고 있지 않음
    • 그래서 먼저 새 데이터셋을 하나 생성해 예측변수 수준에 따라 사건발생확률이 어떻게 변화하는지 확인할 것임
    • 데이터셋 생성방법: 한 예측변수 값은 변화시키고 나머지 예측변수는 평균으로 고정한 가상의 데이터셋 생성

1) 교육수준이 정치성향에 미치는 영향 확인

  • 교육수준이 정치성향에 미치는 영향을 보기 위해
    • 다른 수준은 고정한 채 Education을 low, high 두 가지 수준으로 변화시키고
    • 동시에 나머지 예측변수값은 평균으로 고정한 가상의 데이터셋을 생성함
testdata <- data.frame(Education=c("low", "high"),
                       TVnews=mean(PID$TVnews),
                       Income=mean(PID$Income),
                       Age=mean(PID$Age),
                       Population=mean(PID$Population))
testdata
##   Education   TVnews   Income      Age Population
## 1       low 3.727754 46.57574 47.04343   306.3814
## 2      high 3.727754 46.57574 47.04343   306.3814
  • 결과해석: 생성된 데이터셋에서 교육수준은 low와 high 두개의 값을 갖는 반면에 나머지 예측변수들은 모두 동일값으로 고정되어 있음
  • 이렇게 만들어진 testdata를 predict()의 newdata인수에 지정하고, 추정될 확률을 원래의 testdata와 함께 출력함
pid.mlogit.pred <- predict(pid.mlogit, newdata=testdata, type="response")
cbind(testdata, pid.mlogit.pred)
##   Education   TVnews   Income      Age Population  Democrat Independent
## 1       low 3.727754 46.57574 47.04343   306.3814 0.4169951   0.2852971
## 2      high 3.727754 46.57574 47.04343   306.3814 0.3854667   0.2472630
##   Republican
## 1  0.2977078
## 2  0.3672703
  • 결과해석
    • 교육수준이 증가하면, 즉 교육수준이 low->high로 변화하면
      • Democrat일 확률은 41.7%에서 38.5%로 감소함
      • Republican일 확률은 29.8% 에서 36.7%로 증가함
      • 그래서 교육수준과 정치성향 간에는 관련성이 있어 보임
    • 교육수준 증가가 Democrat일 확률을 감소시키고 Republican일 확률을 증가시키긴 했지만, 교육수준이 높건 낮건 관계없이 결과적으로 Democrat으로 불릴 확률이 가장 높기 때문에 교육수준과 정치성향 간의 명확한 영향관계를 확인하기는 어려움
    • 이는 앞서 교육수준 회귀계수가 통계적으로 유의하지 않은 것과 같은 맥락에서 해석가능

2) 소득수준이 정치성향에 미치는 영향 확인

  • 소득수준이 정치성향에 미치는 영향을 확인하기 위해
    • 다른 변수들은 고정한 채
    • Income을 20~100에 범위 내에서 20씩 변화시키는데
    • Education변수는 모두 low수준으로 고정시키고
    • 나머지 변수들은 모두 평균값으로 고정함
testdata <- data.frame(Education=rep("low", 5),
                       TVnews=mean(PID$TVnews),
                       Income=seq(20, 100, 20),
                       Age=mean(PID$Age),
                       Population=mean(PID$Population))
testdata
##   Education   TVnews Income      Age Population
## 1       low 3.727754     20 47.04343   306.3814
## 2       low 3.727754     40 47.04343   306.3814
## 3       low 3.727754     60 47.04343   306.3814
## 4       low 3.727754     80 47.04343   306.3814
## 5       low 3.727754    100 47.04343   306.3814
  • 결과해석
    • 생성된 새로운 가상의 데이터를 보면 소득은 20에서 100까지 20의 간격으로 변화함
    • 그리고 나머지 변수들은 모두 같은 값으로 고정돼 있음

3) 다시 predict()로 사건발생확률을 추정하고, 데이터셋과 함께 사건발생확률을 출력함

pid.mlogit.pred <- predict(pid.mlogit, newdata=testdata, type="response")
cbind(testdata, pid.mlogit.pred)
##   Education   TVnews Income      Age Population  Democrat Independent
## 1       low 3.727754     20 47.04343   306.3814 0.5253435   0.2330383
## 2       low 3.727754     40 47.04343   306.3814 0.4434690   0.2725630
## 3       low 3.727754     60 47.04343   306.3814 0.3645531   0.3104445
## 4       low 3.727754     80 47.04343   306.3814 0.2923033   0.3448868
## 5       low 3.727754    100 47.04343   306.3814 0.2292065   0.3747050
##   Republican
## 1  0.2416182
## 2  0.2839680
## 3  0.3250024
## 4  0.3628100
## 5  0.3960885
  • 결과해석
    • 소득이 20에서 100으로 변함에 따라,
      • Democrat로 분류될 확률은 52.5%에서 22.9%로 감소함
      • Republican로 분류될 확률은 24.2%에서 39.6%로 증가함
    • 정치성향별 예측확률을 소득군별로 보면
      • 소득이 20~40인 저소득층은 Democrat로 분류될 확률이 가장 높고
      • 소득이 80~100인 고소득층은 Republican로 예측될 가장 큼
    • 따라서 소득과 정치성향 간에는 밀접한 관계가 있는 것으로 보임. 소득이 증가할수록 Republican 성향의 유권자일 가능성이 높다는 것을 알 수 있음

4. 다항 로지스틱회귀분석을 활용한 예

4-1. 활용데이터 분석

  • MASS패키지 fgl데이터셋을 사용한 다항 로지스틱회귀분석 예시
  • fgl데이터셋 설명
    • 214개 의 유리조각에 대한 성분 데이터임. 모두 10개 변수를 포함하고 있음
    • 10개 변수가운데 마지막에 있는 type변수는 유리조각의 유리유형을 나타내는 결과변수임
library(MASS)
str(fgl)
## 'data.frame':    214 obs. of  10 variables:
##  $ RI  : num  3.01 -0.39 -1.82 -0.34 -0.58 ...
##  $ Na  : num  13.6 13.9 13.5 13.2 13.3 ...
##  $ Mg  : num  4.49 3.6 3.55 3.69 3.62 3.61 3.6 3.61 3.58 3.6 ...
##  $ Al  : num  1.1 1.36 1.54 1.29 1.24 1.62 1.14 1.05 1.37 1.36 ...
##  $ Si  : num  71.8 72.7 73 72.6 73.1 ...
##  $ K   : num  0.06 0.48 0.39 0.57 0.55 0.64 0.58 0.57 0.56 0.57 ...
##  $ Ca  : num  8.75 7.83 7.78 8.22 8.07 8.07 8.17 8.24 8.3 8.4 ...
##  $ Ba  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Fe  : num  0 0 0 0 0 0.26 0 0 0 0.11 ...
##  $ type: Factor w/ 6 levels "WinF","WinNF",..: 1 1 1 1 1 1 1 1 1 1 ...
  • type변수는 모두 6개의 범주를 갖고 있음. 유리조각은 이 6개의 유형으로 분류됨
  • 나머지 9개 변수는 유리조각에 대한 성분을 표현해주는 변수임
levels(fgl$type)
## [1] "WinF"  "WinNF" "Veh"   "Con"   "Tabl"  "Head"
head(fgl)
##      RI    Na   Mg   Al    Si    K   Ca Ba   Fe type
## 1  3.01 13.64 4.49 1.10 71.78 0.06 8.75  0 0.00 WinF
## 2 -0.39 13.89 3.60 1.36 72.73 0.48 7.83  0 0.00 WinF
## 3 -1.82 13.53 3.55 1.54 72.99 0.39 7.78  0 0.00 WinF
## 4 -0.34 13.21 3.69 1.29 72.61 0.57 8.22  0 0.00 WinF
## 5 -0.58 13.27 3.62 1.24 73.08 0.55 8.07  0 0.00 WinF
## 6 -2.04 12.79 3.61 1.62 72.97 0.64 8.07  0 0.26 WinF

4-2. 데이터 전처리 <예측변수 표준화, 훈련·테스트데이터 분할> - scale()

  • 이 9개의 성분데이터로 유리조각에 유리유형을 예측하는 다항 로지스틱회귀모델을 생성하기 전 예측변수인 9개의 성분데이터의 특성을 살펴봐야 함
  • 9개의 성분데이터(예측변수) 특성
    • 변수값의 범위가 다양해 소수점 이하나, 10단위 값을 갖고 있는 변수도 있음
    • 이렇게 예측변수 범위가 다양할 때, 예측정확도에 좋지 않은 영향을 미칠 수 있음
    • 그래서 예측모델 생성 전 예측변수를 표준화 작업을 거치는 것이 바람직함
  • 예측변수를 표준화 해 새로운 데이터셋으로 저장함
    • 처음 9개의 변수까지가 예측변수이기 때문에 9개 열만 scale()로 표준화 함
    • 10번째 결과변수를 표준화 데이터 옆에 열로 붙여 원래 데이터셋과 같은 구조로 생성함
fgl.scaled <- cbind(scale(fgl[,1:9]), fgl[10])
head(fgl.scaled)
##           RI         Na        Mg         Al          Si           K         Ca
## 1  0.8708258  0.2842867 1.2517037 -0.6908222 -1.12444556 -0.67013422 -0.1454254
## 2 -0.2487502  0.5904328 0.6346799 -0.1700615  0.10207972 -0.02615193 -0.7918771
## 3 -0.7196308  0.1495824 0.6000157  0.1904651  0.43776033 -0.16414813 -0.8270103
## 4 -0.2322859 -0.2422846 0.6970756 -0.3102663 -0.05284979  0.11184428 -0.5178378
## 5 -0.3113148 -0.1688095 0.6485456 -0.4104126  0.55395746  0.08117845 -0.6232375
## 6 -0.7920739 -0.7566101 0.6416128  0.3506992  0.41193874  0.21917466 -0.6232375
##           Ba         Fe type
## 1 -0.3520514 -0.5850791 WinF
## 2 -0.3520514 -0.5850791 WinF
## 3 -0.3520514 -0.5850791 WinF
## 4 -0.3520514 -0.5850791 WinF
## 5 -0.3520514 -0.5850791 WinF
## 6 -0.3520514  2.0832652 WinF
  • 그 다음 데이터셋을 예측모델 생성과 모델 예측정확도 검증을 위한 훈련·테스트데이터로 분할
    • 여기서는 훈련데이터와 테스트데이터를 7대 3 비율로 분할
    • sample()로 전체 데이터셋으로부터 70%에 해당되는 행의 인덱스 추출
    • 이 인덱스로 전체 데이터셋으로부터 70%에 해당되는 데이터 추출 후 훈련데이터로 만듦
    • 그리고 나머지 30%는 테스트데이터로 만듦
set.seed(123)
train <- sample(nrow(fgl), 0.7*nrow(fgl)) # 70%에 해당되는 행의 인덱스 추출
fgl.train <- fgl.scaled[train,] # 70%에 해당되는 데이터로 훈련데이터 생성
fgl.test <- fgl.scaled[-train,] # 30%에 해당되는 데이터로 테스트데이터 생성
  • 훈련데이터와 테스트데이터에 포함되어 있는 관측값 개수를 계산하고 범주별 빈도 산출
table(fgl.train$type)
## 
##  WinF WinNF   Veh   Con  Tabl  Head 
##    48    54    10    11     5    21
sum(table(fgl.train$type))
## [1] 149
table(fgl.test$type)
## 
##  WinF WinNF   Veh   Con  Tabl  Head 
##    22    22     7     2     4     8
sum(table(fgl.test$type))
## [1] 65
  • 결과: 훈련데이터로 149개의 표본이 선정됐고, 테스트데이터로 65개의 표본이 포함됨

4-3. 예측모델 생성 및 모델 성능 평가 - multinom()

  • 데이터전처리 완료했기 때문에 이 데이터셋으로 여기서는 nnet패키지 multinom()으로 다항 로지스틱회귀모델을 생성하고 회귀모델의 성능을 평가함

1) 예측모델 생성

  • multinom() 인수설명
    • 1st: 결과변수와 예측변수를 포뮬러 형식으로 지정
    • data: 훈련데이터 지정
library(nnet)
fgl.mlogit <- multinom(type ~ ., data=fgl.train)
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 104.572261
## iter  20 value 87.097706
## iter  30 value 79.938775
## iter  40 value 75.064271
## iter  50 value 73.957695
## iter  60 value 72.716878
## iter  70 value 72.340849
## iter  80 value 72.294902
## iter  90 value 72.124134
## iter 100 value 70.138206
## final  value 70.138206 
## stopped after 100 iterations
summary(fgl.mlogit)
## Call:
## multinom(formula = type ~ ., data = fgl.train)
## 
## Coefficients:
##         (Intercept)           RI           Na           Mg           Al
## WinNF  9.355295e-02   -0.8953382    -4.063962    -9.048398   -0.5114149
## Veh   -1.133317e+03   -8.6962954    -5.829434    -7.471188   -3.8837185
## Con   -1.775676e+03  809.3073013 -1498.700238 -5267.689193 2633.0124575
## Tabl  -5.707417e+03 1503.0305115  3453.631581   402.083873 4796.9312859
## Head  -3.440740e+03 3973.2180791  2766.948335  -567.865018 6106.0668565
##                Si            K           Ca           Ba            Fe
## WinNF   -4.762664    -5.224543    -7.036873    -6.887587     0.3130040
## Veh     -9.568647    -8.386972    -2.916572 -3210.962579     0.2369889
## Con    411.127578 -2096.906954 -3215.489971  3890.713662 -1142.1918822
## Tabl  2213.126387 -5318.320088   850.190516   356.705594 -4547.5583901
## Head  5085.219765   463.552739  -641.047022  4867.920520 -1662.5175395
## 
## Std. Errors:
##       (Intercept)        RI       Na        Mg        Al        Si         K
## WinNF    2.250252  1.199627 2.399749  4.300370  1.600933  2.240364  2.512023
## Veh      1.639861  2.688003 3.037652  5.870651  2.192671  3.194121  3.509944
## Con     13.950757 10.090718 4.104262 13.278437 15.332909  3.331481 62.182580
## Tabl     0.000000  0.000000 0.000000  0.000000  0.000000  0.000000  0.000000
## Head     5.158491  8.757124 2.576395  9.600709 16.273983 12.993265 45.186352
##              Ca         Ba        Fe
## WinNF  4.440853  6.3418754 0.2713187
## Veh    5.911691  0.5773154 0.4929929
## Con   12.352283 16.6950553 7.2049922
## Tabl   0.000000  0.0000000 0.0000000
## Head   7.347112  1.8160539 3.0181253
## 
## Residual Deviance: 140.2764 
## AIC: 240.2764
  • 결과:
    • multinom()은 1st범주를 기준 범주로 사용하고, WinF가 1st범주이므로 기준범주로 사용됨
    • 결과변수로 6개 범주가 있기 때문에 5개 절편과 각 예측변수 별 5개 회귀계수가 계산됨
    • multinom()은 회귀계수에 대한 유의확률을 제공하지 않으므로 회귀계수에 대한 유의성 검정을 위해 별도로 유의확률을 계산해야 함

2) 회귀계수의 유의성 검정 - z-value, pnorm()

  • 회귀계수를 표준오차로 나눠 z값을 구하고 z값을 pnorm()에 적용해 유의확률 산출
z <- summary(fgl.mlogit)$coefficients/summary(fgl.mlogit)$standard.errors
  • 유의확률은 표준 정규분포 상의 양쪽 꼬리부분 면적을 계산하면 됨
    • pnorm()로 z값에 절대값 취한 후,
    • 표준 정규분포 상에서 z값까지의 누적 확률을 계산함
    • 1에서 이 누적확률을 빼면 오른쪽 꼬리부분이 먼저 계산되고
    • 그 값을 2배하면 양쪽 꼬리 부분의 면적을 계산할 수 있음
    • 이렇게 계산 된 p는 각 회귀계수에 대한 유의확룰이 됨
p <- (1-pnorm(abs(z), 0, 1))*2
print(p, digits=3)
##       (Intercept)      RI     Na     Mg     Al      Si      K    Ca    Ba    Fe
## WinNF       0.967 0.45546 0.0904 0.0354 0.7494 0.03352 0.0375 0.113 0.277 0.249
## Veh         0.000 0.00122 0.0550 0.2031 0.0765 0.00274 0.0169 0.622 0.000 0.631
## Con         0.000 0.00000 0.0000 0.0000 0.0000 0.00000 0.0000 0.000 0.000 0.000
## Tabl        0.000 0.00000 0.0000 0.0000 0.0000 0.00000 0.0000 0.000 0.000 0.000
## Head        0.000 0.00000 0.0000 0.0000 0.0000 0.00000 0.0000 0.000 0.000 0.000

3) 예측모델로 새 데이터에 대한 예측확률 추정 - predict()

  • predict()로 생성한 예측모델을 바탕으로 새로운 데이터에 대한 예측확률 추정 가능
  • predict() 인수설명
    • 1st: 다항 로지스틱회귀모델 지정
    • newdata: 예측 대상 데이터를 지정. 여기서는 테스트데이터를 지정함
    • type: 예측 유형을 지정함. “probs”를 지정해 회귀모델에 의해 추정된 확률을 얻을 수 있음
fgl.mlogit.pred <- predict(fgl.mlogit, newdata=fgl.test, type="probs")
head(fgl.mlogit.pred)
##         WinF     WinNF          Veh Con Tabl Head
## 2  0.5678865 0.4315058 0.0006076739   0    0    0
## 3  0.1905724 0.8021744 0.0072532302   0    0    0
## 10 0.6469285 0.3506427 0.0024288411   0    0    0
## 11 0.1330417 0.8502778 0.0166805273   0    0    0
## 12 0.8038316 0.1918443 0.0043241395   0    0    0
## 15 0.7941149 0.2050818 0.0008032298   0    0    0
  • 각 유리유형별로 추정된 예측확률 옆에 실제 유리유형을 추가해 예측확률과 실제 범주 간 관계를 확인함
cbind(round(fgl.mlogit.pred, 3), fgl.test["type"])
##      WinF WinNF   Veh   Con  Tabl Head  type
## 2   0.568 0.432 0.001 0.000 0.000    0  WinF
## 3   0.191 0.802 0.007 0.000 0.000    0  WinF
## 10  0.647 0.351 0.002 0.000 0.000    0  WinF
## 11  0.133 0.850 0.017 0.000 0.000    0  WinF
## 12  0.804 0.192 0.004 0.000 0.000    0  WinF
## 15  0.794 0.205 0.001 0.000 0.000    0  WinF
## 18  0.554 0.356 0.089 0.000 0.000    0  WinF
## 19  0.254 0.409 0.337 0.000 0.000    0  WinF
## 28  0.448 0.541 0.012 0.000 0.000    0  WinF
## 29  0.514 0.484 0.002 0.000 0.000    0  WinF
## 31  0.688 0.307 0.005 0.000 0.000    0  WinF
## 33  0.715 0.285 0.000 0.000 0.000    0  WinF
## 44  0.882 0.062 0.056 0.000 0.000    0  WinF
## 45  0.356 0.621 0.022 0.000 0.000    0  WinF
## 47  0.637 0.359 0.004 0.000 0.000    0  WinF
## 49  0.839 0.092 0.068 0.000 0.000    0  WinF
## 57  0.000 0.000 1.000 0.000 0.000    0  WinF
## 58  0.459 0.539 0.002 0.000 0.000    0  WinF
## 59  0.914 0.086 0.000 0.000 0.000    0  WinF
## 61  0.599 0.383 0.019 0.000 0.000    0  WinF
## 65  0.813 0.164 0.023 0.000 0.000    0  WinF
## 66  0.436 0.496 0.068 0.000 0.000    0  WinF
## 73  0.423 0.573 0.005 0.000 0.000    0 WinNF
## 82  0.404 0.591 0.005 0.000 0.000    0 WinNF
## 88  0.247 0.731 0.022 0.000 0.000    0 WinNF
## 95  0.349 0.646 0.005 0.000 0.000    0 WinNF
## 96  0.126 0.851 0.023 0.000 0.000    0 WinNF
## 100 0.661 0.339 0.000 0.000 0.000    0 WinNF
## 101 0.325 0.675 0.000 0.000 0.000    0 WinNF
## 102 0.038 0.921 0.041 0.000 0.000    0 WinNF
## 107 0.000 0.000 0.000 1.000 0.000    0 WinNF
## 111 0.373 0.622 0.005 0.000 0.000    0 WinNF
## 113 0.181 0.800 0.018 0.000 0.000    0 WinNF
## 120 0.162 0.774 0.064 0.000 0.000    0 WinNF
## 124 0.154 0.843 0.003 0.000 0.000    0 WinNF
## 125 0.914 0.086 0.000 0.000 0.000    0 WinNF
## 126 0.274 0.724 0.002 0.000 0.000    0 WinNF
## 129 0.299 0.701 0.000 0.000 0.000    0 WinNF
## 131 0.000 0.000 0.000 0.000 1.000    0 WinNF
## 138 0.338 0.660 0.002 0.000 0.000    0 WinNF
## 139 0.472 0.528 0.000 0.000 0.000    0 WinNF
## 142 0.870 0.130 0.000 0.000 0.000    0 WinNF
## 144 0.172 0.827 0.002 0.000 0.000    0 WinNF
## 145 0.223 0.558 0.220 0.000 0.000    0 WinNF
## 147 0.479 0.350 0.170 0.000 0.000    0   Veh
## 151 0.061 0.890 0.048 0.000 0.000    0   Veh
## 156 0.452 0.409 0.139 0.000 0.000    0   Veh
## 157 0.304 0.306 0.390 0.000 0.000    0   Veh
## 160 0.071 0.756 0.173 0.000 0.000    0   Veh
## 161 0.246 0.668 0.086 0.000 0.000    0   Veh
## 162 0.884 0.116 0.000 0.000 0.000    0   Veh
## 171 0.000 0.000 0.000 0.419 0.581    0   Con
## 172 0.000 0.000 0.000 1.000 0.000    0   Con
## 177 0.000 0.000 0.000 0.000 1.000    0  Tabl
## 178 0.000 0.000 0.000 0.000 1.000    0  Tabl
## 180 0.000 0.000 0.000 0.000 1.000    0  Tabl
## 182 0.000 0.000 0.000 0.000 1.000    0  Tabl
## 186 0.000 0.000 0.000 1.000 0.000    0  Head
## 187 0.000 0.000 0.000 0.000 0.000    1  Head
## 188 0.840 0.160 0.000 0.000 0.000    0  Head
## 189 0.000 0.000 0.000 0.000 1.000    0  Head
## 191 0.000 0.000 0.000 1.000 0.000    0  Head
## 205 0.000 0.000 0.000 0.000 0.000    1  Head
## 210 0.000 0.000 0.000 0.000 0.000    1  Head
## 214 0.000 0.000 0.000 0.000 0.000    1  Head
  • 결과
    • 일반적으로 가장 높은 예측확률을 갖는 범주가 예측범주로 선택되기 때문에 이를 통해 각 케이스 별로 예측성공 여부를 확인할 수 있음
    • 케이스1에서 WinF의 확률이 가장 크기 때문에 WinF로 분류될 것임. 그런데 실제 유리유형도 Winf 이기 때문에 케이스1 같은 경우 예측모델에 의한 예측결과와 실제결과가 일치함

4-4. 테스트데이터에 대한 예측정확도 산출

  • 가장 높은 예측확률을 갖는 범주를 예측범주로 선택하는데, max.col()로 가장 높은 예측확률을 갖는 열의 인덱스를 추출할 수 있음
 max.col(fgl.mlogit.pred)
##  [1] 1 2 1 2 1 1 1 2 2 1 1 1 1 2 1 1 3 2 1 1 1 2 2 2 2 2 2 1 2 2 4 2 2 2 2 1 2 2
## [39] 5 2 2 1 2 2 1 2 1 3 2 2 1 5 4 5 5 5 5 4 6 1 5 4 6 6 6
  • 추출한 열의 인덱스에 대응되는 열이름을 선택하면 그 열이름이 예측범주가 됨
  • 이렇게 선택된 예측범주를 예측확률이 저장된 변수와 동일한 이름으로 저장함
  • 그러면 이 변수에는 더 이상 예측한 유의확률이 아니라 실제 예측범주가 저장됨
colnames(fgl.mlogit.pred)
## [1] "WinF"  "WinNF" "Veh"   "Con"   "Tabl"  "Head"
colnames(fgl.mlogit.pred)[max.col(fgl.mlogit.pred)]
##  [1] "WinF"  "WinNF" "WinF"  "WinNF" "WinF"  "WinF"  "WinF"  "WinNF" "WinNF"
## [10] "WinF"  "WinF"  "WinF"  "WinF"  "WinNF" "WinF"  "WinF"  "Veh"   "WinNF"
## [19] "WinF"  "WinF"  "WinF"  "WinNF" "WinNF" "WinNF" "WinNF" "WinNF" "WinNF"
## [28] "WinF"  "WinNF" "WinNF" "Con"   "WinNF" "WinNF" "WinNF" "WinNF" "WinF" 
## [37] "WinNF" "WinNF" "Tabl"  "WinNF" "WinNF" "WinF"  "WinNF" "WinNF" "WinF" 
## [46] "WinNF" "WinF"  "Veh"   "WinNF" "WinNF" "WinF"  "Tabl"  "Con"   "Tabl" 
## [55] "Tabl"  "Tabl"  "Tabl"  "Con"   "Head"  "WinF"  "Tabl"  "Con"   "Head" 
## [64] "Head"  "Head"
fgl.mlogit.pred <- colnames(fgl.mlogit.pred)[max.col(fgl.mlogit.pred)]
head(fgl.mlogit.pred)
## [1] "WinF"  "WinNF" "WinF"  "WinNF" "WinF"  "WinF"
  • 실제 유형과 예측유형 간의 혼동행렬 생성
table(fgl.test$type, 
      fgl.mlogit.pred, 
      dnn=c("Actual", "Predicted"))
##        Predicted
## Actual  Con Head Tabl Veh WinF WinNF
##   WinF    0    0    0   1   14     7
##   WinNF   1    0    1   0    3    17
##   Veh     0    0    0   1    3     3
##   Con     1    0    1   0    0     0
##   Tabl    0    0    4   0    0     0
##   Head    2    4    1   0    1     0
  • 결과: 생성된 혼동행렬이 부자연스러운 이유는 실제 유형 범주순서와 예측유형 범주순서가 서로 일치하지 않기 때문임. 출력된 범주순서를 동일하게 만들어야 함
  • factor()범주 출력 순서를 조정해 범주순서를 동일하게 만들어야 함
    • levels와 lables인수에 순서를 일치시키고자 하는 테스트데이터셋의 범주레벨을 지정함
table(fgl.test$type, 
      factor(fgl.mlogit.pred,
             levels=levels(fgl.test$type),
             labels=levels(fgl.test$type)),
      dnn=c("Actual", "Predicted"))
##        Predicted
## Actual  WinF WinNF Veh Con Tabl Head
##   WinF    14     7   1   0    0    0
##   WinNF    3    17   0   1    1    0
##   Veh      3     3   1   0    0    0
##   Con      0     0   0   1    1    0
##   Tabl     0     0   0   0    4    0
##   Head     1     0   0   2    1    4
  • 결과
    • 혼동행렬이 잘 생성되고, 실제 유형과 예측유형년간의 범주출력순서가 일치함
    • 혼돈행렬의 대각선 수치는 예측모델 위해서 정확히 예측된 빈도를 나타냄
  • 예측정확도 계산
mean(fgl.test$type == fgl.mlogit.pred)
## [1] 0.6307692
  • 결과: 예측정확도는 63.1% 정도로 계산됨
  • 교차검증
    • 좀 더 안정적인 성능평가를 위해 100개의 표본을 생성해 교차검증을 수행
    • 앞서와 마찬가지로 100개의 표본각각은 70% 훈련데이터와 30% 테스트데이터로 구성함
    • 먼저 교차검증 결과를 저장할 빈 숫자 벡터를 생성함
    • 100번의 루프를 돌며 훈련/테스트데이터 생성->모델생성->예측->예측정확도 계산작업을 수행함
      • 먼저 훈련데이터와 테스트데이터를 생성함
      • 그리고 모델을 생성함
      • 생성한 모델을 바탕으로 예측확률을 계산함
      • 그리고 예측확률을 예측범주로 변환함
      • 끝으로 예측정확도를 계산해 숫자벡터에 저장함
    • 100번의 루프를 돌리는 작업 수행
fgl.mlogit.cv <- numeric()
for (i in 1:100) {
  train <- sample(nrow(fgl), 0.7*nrow(fgl))
  fgl.train <- fgl.scaled[train,]
  fgl.test <- fgl.scaled[-train,]
  fgl.mlogit <- multinom(type ~ ., data=fgl.train)
  fgl.mlogit.pred <- predict(fgl.mlogit, newdata=fgl.test, type="probs")
  fgl.mlogit.pred <- colnames(fgl.mlogit.pred)[max.col(fgl.mlogit.pred)]
  fgl.mlogit.cv[i] <-  mean(fgl.test$type == fgl.mlogit.pred)
}
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 106.237110
## iter  20 value 85.497156
## iter  30 value 75.534881
## iter  40 value 72.682834
## iter  50 value 71.650532
## iter  60 value 70.869539
## iter  70 value 70.328520
## iter  80 value 69.752320
## iter  90 value 69.708451
## iter 100 value 69.706191
## final  value 69.706191 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 102.868859
## iter  20 value 79.253817
## iter  30 value 69.045282
## iter  40 value 65.342147
## iter  50 value 63.767411
## iter  60 value 63.574195
## iter  70 value 63.325357
## iter  80 value 63.254133
## iter  90 value 63.208271
## iter 100 value 63.205361
## final  value 63.205361 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 117.414490
## iter  20 value 91.202816
## iter  30 value 77.635322
## iter  40 value 75.433440
## iter  50 value 74.118263
## iter  60 value 74.032203
## iter  70 value 73.953516
## iter  80 value 73.946065
## final  value 73.946032 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 111.901539
## iter  20 value 93.994155
## iter  30 value 80.604880
## iter  40 value 79.201634
## iter  50 value 78.842195
## iter  60 value 78.762202
## iter  70 value 78.708928
## iter  80 value 78.693639
## iter  90 value 78.677426
## iter 100 value 78.676985
## final  value 78.676985 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 111.743373
## iter  20 value 86.891546
## iter  30 value 77.019286
## iter  40 value 74.786776
## iter  50 value 72.672161
## iter  60 value 71.952992
## iter  70 value 71.147763
## iter  80 value 70.634597
## iter  90 value 70.630140
## final  value 70.630109 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 110.674874
## iter  20 value 89.401936
## iter  30 value 79.144977
## iter  40 value 74.264362
## iter  50 value 73.501085
## iter  60 value 72.873874
## iter  70 value 72.625541
## iter  80 value 72.619157
## final  value 72.619049 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.127285
## iter  20 value 92.114248
## iter  30 value 81.013154
## iter  40 value 77.931815
## iter  50 value 76.242122
## iter  60 value 74.438350
## iter  70 value 74.369305
## iter  80 value 74.368027
## final  value 74.368022 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 111.578517
## iter  20 value 89.473280
## iter  30 value 76.850980
## iter  40 value 74.597902
## iter  50 value 73.193743
## iter  60 value 73.073692
## iter  70 value 72.946882
## iter  80 value 72.732922
## iter  90 value 72.724004
## iter 100 value 72.714157
## final  value 72.714157 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 113.810985
## iter  20 value 97.067567
## iter  30 value 86.296931
## iter  40 value 82.387621
## iter  50 value 76.979678
## iter  60 value 75.950893
## iter  70 value 75.836666
## iter  80 value 75.833604
## final  value 75.833448 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 118.614313
## iter  20 value 99.037969
## iter  30 value 88.442385
## iter  40 value 85.901997
## iter  50 value 84.615346
## iter  60 value 84.284708
## iter  70 value 83.834522
## iter  80 value 83.820641
## iter  90 value 83.819719
## iter  90 value 83.819718
## iter  90 value 83.819718
## final  value 83.819718 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 103.306683
## iter  20 value 85.362137
## iter  30 value 72.812560
## iter  40 value 66.753417
## iter  50 value 62.515994
## iter  60 value 61.673339
## iter  70 value 61.553732
## iter  80 value 61.430823
## iter  90 value 61.327296
## iter 100 value 61.219989
## final  value 61.219989 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 101.308686
## iter  20 value 76.649241
## iter  30 value 66.170107
## iter  40 value 62.490560
## iter  50 value 60.879452
## iter  60 value 60.495073
## iter  70 value 60.166753
## iter  80 value 60.154926
## final  value 60.154814 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 112.547208
## iter  20 value 93.621249
## iter  30 value 81.611336
## iter  40 value 78.487199
## iter  50 value 77.891136
## iter  60 value 77.358815
## iter  70 value 77.283807
## iter  80 value 77.281928
## final  value 77.281778 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 113.640417
## iter  20 value 98.226435
## iter  30 value 86.724317
## iter  40 value 84.710433
## iter  50 value 83.798148
## iter  60 value 83.417610
## iter  70 value 83.260109
## iter  80 value 83.160066
## iter  90 value 83.148930
## iter 100 value 83.100565
## final  value 83.100565 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 102.588010
## iter  20 value 82.207397
## iter  30 value 72.386681
## iter  40 value 68.273604
## iter  50 value 67.476262
## iter  60 value 66.954568
## iter  70 value 66.755371
## iter  80 value 66.748071
## iter  90 value 66.742875
## final  value 66.742842 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 118.135220
## iter  20 value 96.943434
## iter  30 value 83.217643
## iter  40 value 78.964215
## iter  50 value 77.041394
## iter  60 value 76.692134
## iter  70 value 76.367802
## iter  80 value 76.353407
## iter  90 value 76.352507
## final  value 76.352505 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 115.897497
## iter  20 value 98.462069
## iter  30 value 85.913820
## iter  40 value 83.256125
## iter  50 value 81.724191
## iter  60 value 80.877594
## iter  70 value 80.865256
## final  value 80.865201 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 111.616015
## iter  20 value 86.948870
## iter  30 value 79.167250
## iter  40 value 77.609382
## iter  50 value 77.366747
## iter  60 value 77.226234
## iter  70 value 77.221066
## iter  80 value 77.220864
## final  value 77.220710 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 99.988782
## iter  20 value 87.634528
## iter  30 value 80.073063
## iter  40 value 78.683497
## iter  50 value 78.503654
## iter  60 value 78.312467
## iter  70 value 78.276494
## iter  80 value 78.274429
## final  value 78.274413 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 112.553161
## iter  20 value 92.116991
## iter  30 value 81.423505
## iter  40 value 76.034775
## iter  50 value 74.846347
## iter  60 value 73.333724
## iter  70 value 72.804174
## iter  80 value 72.757048
## iter  90 value 72.756118
## final  value 72.756105 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 113.183003
## iter  20 value 92.041749
## iter  30 value 80.847200
## iter  40 value 78.770177
## iter  50 value 78.359424
## iter  60 value 78.274072
## iter  70 value 78.205875
## iter  80 value 78.185761
## iter  90 value 78.182349
## iter 100 value 78.179891
## final  value 78.179891 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 102.771624
## iter  20 value 91.445780
## iter  30 value 81.641386
## iter  40 value 78.974000
## iter  50 value 78.358258
## iter  60 value 78.100503
## iter  70 value 78.092235
## final  value 78.092186 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 119.204066
## iter  20 value 99.652341
## iter  30 value 87.940129
## iter  40 value 85.437046
## iter  50 value 84.160610
## iter  60 value 83.960860
## iter  70 value 83.955755
## final  value 83.955734 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 106.796917
## iter  20 value 88.056196
## iter  30 value 79.849540
## iter  40 value 76.834296
## iter  50 value 75.977136
## iter  60 value 75.768326
## iter  70 value 75.101550
## iter  80 value 73.251089
## iter  90 value 71.920955
## iter 100 value 71.575443
## final  value 71.575443 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.310401
## iter  20 value 91.631989
## iter  30 value 79.167128
## iter  40 value 77.318197
## iter  50 value 75.277259
## iter  60 value 75.107321
## iter  70 value 75.035181
## iter  80 value 74.926718
## iter  90 value 74.875500
## iter 100 value 74.831161
## final  value 74.831161 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 114.421331
## iter  20 value 90.900451
## iter  30 value 79.245566
## iter  40 value 77.463844
## iter  50 value 77.260272
## iter  60 value 77.019632
## iter  70 value 76.978880
## iter  80 value 76.978008
## final  value 76.978005 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.529868
## iter  20 value 82.397728
## iter  30 value 66.963717
## iter  40 value 61.411228
## iter  50 value 60.143826
## iter  60 value 59.792654
## iter  70 value 59.289475
## iter  80 value 59.248774
## iter  90 value 59.247251
## final  value 59.247245 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.184004
## iter  20 value 83.974556
## iter  30 value 74.866070
## iter  40 value 72.657805
## iter  50 value 71.285836
## iter  60 value 71.055374
## iter  70 value 70.801675
## iter  80 value 70.244520
## iter  90 value 69.785649
## iter 100 value 68.281023
## final  value 68.281023 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 113.427278
## iter  20 value 96.760211
## iter  30 value 84.673153
## iter  40 value 79.713791
## iter  50 value 78.073882
## iter  60 value 75.335634
## iter  70 value 72.577591
## iter  80 value 71.903272
## iter  90 value 71.740030
## iter 100 value 71.738477
## final  value 71.738477 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 99.870630
## iter  20 value 88.942047
## iter  30 value 82.833074
## iter  40 value 81.666392
## iter  50 value 81.070264
## iter  60 value 80.971103
## iter  70 value 80.715113
## iter  80 value 79.751923
## iter  90 value 76.276205
## iter 100 value 76.191704
## final  value 76.191704 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 114.652009
## iter  20 value 89.897796
## iter  30 value 75.885188
## iter  40 value 72.828934
## iter  50 value 72.050696
## iter  60 value 71.613134
## iter  70 value 71.418778
## iter  80 value 71.413821
## final  value 71.413798 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 110.895233
## iter  20 value 83.637523
## iter  30 value 72.002443
## iter  40 value 69.213639
## iter  50 value 68.442980
## iter  60 value 68.021717
## iter  70 value 67.970072
## iter  80 value 67.967799
## final  value 67.967775 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 110.129881
## iter  20 value 84.845108
## iter  30 value 73.625308
## iter  40 value 72.376437
## iter  50 value 71.628884
## iter  60 value 71.574012
## iter  70 value 71.537064
## iter  80 value 71.441317
## iter  90 value 71.414599
## iter 100 value 71.411586
## final  value 71.411586 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 118.978974
## iter  20 value 99.434471
## iter  30 value 86.967202
## iter  40 value 84.539363
## iter  50 value 84.081714
## iter  60 value 84.034512
## iter  70 value 84.015332
## iter  80 value 84.011916
## final  value 84.011842 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 119.013694
## iter  20 value 103.794042
## iter  30 value 95.711253
## iter  40 value 92.587051
## iter  50 value 92.053272
## iter  60 value 91.608057
## iter  70 value 91.558155
## iter  80 value 91.548294
## iter  90 value 91.532656
## iter 100 value 91.520833
## final  value 91.520833 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.209431
## iter  20 value 91.229786
## iter  30 value 82.124884
## iter  40 value 79.026342
## iter  50 value 78.533532
## iter  60 value 78.177283
## iter  70 value 77.985251
## iter  80 value 77.956354
## iter  90 value 77.913266
## iter 100 value 77.888900
## final  value 77.888900 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 117.094361
## iter  20 value 102.898834
## iter  30 value 89.431945
## iter  40 value 85.252013
## iter  50 value 84.050231
## iter  60 value 81.950144
## iter  70 value 81.884836
## iter  80 value 81.883347
## final  value 81.883338 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 114.232837
## iter  20 value 97.783895
## iter  30 value 86.176279
## iter  40 value 82.608968
## iter  50 value 82.149487
## iter  60 value 81.482343
## iter  70 value 80.570496
## iter  80 value 80.442556
## iter  90 value 80.437315
## final  value 80.437232 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 106.056848
## iter  20 value 85.207085
## iter  30 value 74.804852
## iter  40 value 69.603075
## iter  50 value 66.784677
## iter  60 value 64.807193
## iter  70 value 64.137868
## iter  80 value 63.742802
## iter  90 value 63.708671
## iter 100 value 63.708346
## final  value 63.708346 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.877096
## iter  20 value 92.720626
## iter  30 value 83.053829
## iter  40 value 81.172325
## iter  50 value 80.998294
## iter  60 value 80.822298
## iter  70 value 80.813127
## final  value 80.813041 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 114.502649
## iter  20 value 92.378423
## iter  30 value 83.685318
## iter  40 value 79.729853
## iter  50 value 79.325187
## iter  60 value 79.112083
## iter  70 value 78.971652
## iter  80 value 78.940456
## iter  90 value 78.932338
## iter 100 value 78.918429
## final  value 78.918429 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.559294
## iter  20 value 93.464582
## iter  30 value 81.772361
## iter  40 value 79.365624
## iter  50 value 78.727980
## iter  60 value 78.452809
## iter  70 value 78.393804
## iter  80 value 78.392962
## final  value 78.392959 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.241181
## iter  20 value 84.712616
## iter  30 value 67.794646
## iter  40 value 65.099258
## iter  50 value 61.875353
## iter  60 value 61.800640
## iter  70 value 61.793104
## iter  80 value 61.791492
## iter  90 value 61.789643
## iter 100 value 61.785452
## final  value 61.785452 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 100.042039
## iter  20 value 87.268700
## iter  30 value 80.094242
## iter  40 value 79.252313
## iter  50 value 78.944424
## iter  60 value 78.818228
## iter  70 value 78.793742
## iter  80 value 78.793098
## iter  80 value 78.793098
## iter  80 value 78.793098
## final  value 78.793098 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 121.760177
## iter  20 value 103.045972
## iter  30 value 93.120436
## iter  40 value 90.380214
## iter  50 value 90.188863
## iter  60 value 89.901340
## iter  70 value 89.846075
## iter  80 value 89.826163
## iter  90 value 89.807819
## iter 100 value 89.796522
## final  value 89.796522 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 114.329565
## iter  20 value 93.676258
## iter  30 value 78.731725
## iter  40 value 76.515813
## iter  50 value 75.932313
## iter  60 value 75.315832
## iter  70 value 75.175693
## iter  80 value 75.143349
## iter  90 value 75.142550
## iter 100 value 75.141194
## final  value 75.141194 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 106.555216
## iter  20 value 81.700851
## iter  30 value 70.413170
## iter  40 value 67.960654
## iter  50 value 67.170418
## iter  60 value 66.933914
## iter  70 value 66.886880
## iter  80 value 66.844538
## iter  90 value 66.821765
## iter 100 value 66.821224
## final  value 66.821224 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 106.724042
## iter  20 value 90.108723
## iter  30 value 83.402662
## iter  40 value 81.347789
## iter  50 value 80.221287
## iter  60 value 78.977814
## iter  70 value 77.017438
## iter  80 value 76.871815
## iter  90 value 76.870697
## final  value 76.870695 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 110.405304
## iter  20 value 86.418503
## iter  30 value 75.530019
## iter  40 value 73.529622
## iter  50 value 72.040646
## iter  60 value 71.843861
## iter  70 value 71.673494
## iter  80 value 71.656475
## iter  90 value 71.653153
## final  value 71.653129 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.427410
## iter  20 value 93.644508
## iter  30 value 83.221887
## iter  40 value 80.162580
## iter  50 value 79.522608
## iter  60 value 79.010640
## iter  70 value 78.897023
## iter  80 value 78.895888
## final  value 78.895832 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 112.243132
## iter  20 value 95.990301
## iter  30 value 86.095853
## iter  40 value 83.185089
## iter  50 value 81.152478
## iter  60 value 79.590541
## iter  70 value 77.383530
## iter  80 value 77.108649
## iter  90 value 77.103067
## final  value 77.103040 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 110.932481
## iter  20 value 92.315911
## iter  30 value 80.395344
## iter  40 value 74.678908
## iter  50 value 74.050540
## iter  60 value 73.468600
## iter  70 value 72.938078
## iter  80 value 72.781476
## iter  90 value 72.654109
## iter 100 value 72.459978
## final  value 72.459978 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.553377
## iter  20 value 90.217498
## iter  30 value 78.410126
## iter  40 value 77.262527
## iter  50 value 76.639272
## iter  60 value 76.569500
## iter  70 value 76.563915
## iter  80 value 76.562730
## final  value 76.562686 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 113.007482
## iter  20 value 96.736013
## iter  30 value 89.591419
## iter  40 value 88.188009
## iter  50 value 87.804005
## iter  60 value 87.725147
## iter  70 value 87.683130
## iter  80 value 87.681259
## final  value 87.681256 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.339514
## iter  20 value 94.015326
## iter  30 value 82.000887
## iter  40 value 79.645253
## iter  50 value 78.388742
## iter  60 value 77.632267
## iter  70 value 77.620626
## iter  80 value 77.620014
## final  value 77.620012 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 103.908583
## iter  20 value 79.059743
## iter  30 value 70.600729
## iter  40 value 68.527057
## iter  50 value 68.169936
## iter  60 value 67.861157
## iter  70 value 67.734338
## iter  80 value 67.727665
## iter  90 value 67.724771
## final  value 67.724762 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 103.400377
## iter  20 value 87.048614
## iter  30 value 78.071695
## iter  40 value 76.368293
## iter  50 value 76.109063
## iter  60 value 76.032179
## iter  70 value 76.030060
## final  value 76.030049 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 113.666573
## iter  20 value 99.244302
## iter  30 value 87.420912
## iter  40 value 83.982066
## iter  50 value 82.192003
## iter  60 value 79.893702
## iter  70 value 77.786202
## iter  80 value 77.766694
## final  value 77.766633 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 98.631701
## iter  20 value 86.151327
## iter  30 value 75.634914
## iter  40 value 73.359728
## iter  50 value 72.822614
## iter  60 value 72.447694
## iter  70 value 72.431775
## iter  80 value 72.431511
## final  value 72.431509 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 106.585843
## iter  20 value 84.152198
## iter  30 value 75.886824
## iter  40 value 73.206782
## iter  50 value 71.397131
## iter  60 value 70.316145
## iter  70 value 67.175679
## iter  80 value 66.815491
## iter  90 value 66.811413
## final  value 66.811373 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 118.832533
## iter  20 value 100.154801
## iter  30 value 91.371556
## iter  40 value 85.273571
## iter  50 value 83.157001
## iter  60 value 80.703390
## iter  70 value 80.157687
## iter  80 value 80.143169
## iter  90 value 80.142891
## iter  90 value 80.142890
## iter  90 value 80.142890
## final  value 80.142890 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 103.620390
## iter  20 value 89.130483
## iter  30 value 79.906000
## iter  40 value 78.513813
## iter  50 value 77.867617
## iter  60 value 77.724417
## iter  70 value 77.676166
## iter  80 value 77.643253
## iter  90 value 77.637971
## iter 100 value 77.634407
## final  value 77.634407 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.166428
## iter  20 value 87.345384
## iter  30 value 74.388780
## iter  40 value 70.307100
## iter  50 value 68.818269
## iter  60 value 67.203536
## iter  70 value 65.763380
## iter  80 value 65.543446
## iter  90 value 65.520806
## iter 100 value 65.518054
## final  value 65.518054 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 113.285695
## iter  20 value 93.121365
## iter  30 value 81.875479
## iter  40 value 78.960096
## iter  50 value 77.823962
## iter  60 value 77.375683
## iter  70 value 77.341882
## iter  80 value 77.340643
## final  value 77.340624 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 110.889655
## iter  20 value 95.930510
## iter  30 value 87.281572
## iter  40 value 84.261917
## iter  50 value 82.018344
## iter  60 value 80.845191
## iter  70 value 80.829189
## final  value 80.829108 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 113.554640
## iter  20 value 94.941121
## iter  30 value 84.860261
## iter  40 value 82.472305
## iter  50 value 80.405900
## iter  60 value 79.684578
## iter  70 value 78.875035
## iter  80 value 77.357606
## iter  90 value 75.490651
## iter 100 value 75.479091
## final  value 75.479091 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.714221
## iter  20 value 89.434012
## iter  30 value 78.505686
## iter  40 value 73.288119
## iter  50 value 71.909485
## iter  60 value 71.700725
## iter  70 value 71.696921
## final  value 71.696750 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 103.111113
## iter  20 value 87.718548
## iter  30 value 78.046836
## iter  40 value 75.846631
## iter  50 value 75.395504
## iter  60 value 75.222799
## iter  70 value 75.220071
## final  value 75.220021 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 114.377461
## iter  20 value 95.475592
## iter  30 value 80.804003
## iter  40 value 78.846302
## iter  50 value 78.274950
## iter  60 value 78.110568
## iter  70 value 78.088038
## iter  80 value 78.086725
## final  value 78.086722 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.047103
## iter  20 value 95.076435
## iter  30 value 85.100136
## iter  40 value 82.573288
## iter  50 value 81.724148
## iter  60 value 80.303946
## iter  70 value 80.046455
## iter  80 value 80.037775
## final  value 80.037650 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.885705
## iter  20 value 97.600935
## iter  30 value 85.010133
## iter  40 value 81.740820
## iter  50 value 80.494033
## iter  60 value 80.006639
## iter  70 value 79.985036
## iter  80 value 79.984635
## iter  80 value 79.984634
## iter  80 value 79.984634
## final  value 79.984634 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 104.046864
## iter  20 value 85.448335
## iter  30 value 73.826948
## iter  40 value 71.882321
## iter  50 value 71.723566
## iter  60 value 71.546125
## iter  70 value 71.401442
## iter  80 value 71.348489
## iter  90 value 71.345972
## final  value 71.345611 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 106.421637
## iter  20 value 89.263320
## iter  30 value 80.771150
## iter  40 value 77.286711
## iter  50 value 73.932108
## iter  60 value 70.847136
## iter  70 value 69.388497
## iter  80 value 69.370474
## final  value 69.370367 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.276276
## iter  20 value 92.260268
## iter  30 value 82.925370
## iter  40 value 80.418213
## iter  50 value 79.949677
## iter  60 value 79.554407
## iter  70 value 79.544501
## final  value 79.544211 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 107.197444
## iter  20 value 92.725232
## iter  30 value 82.250465
## iter  40 value 78.468889
## iter  50 value 76.349944
## iter  60 value 75.023418
## iter  70 value 74.397127
## iter  80 value 74.365816
## iter  90 value 74.365214
## iter  90 value 74.365213
## iter  90 value 74.365213
## final  value 74.365213 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 114.393510
## iter  20 value 96.824011
## iter  30 value 82.956168
## iter  40 value 81.414750
## iter  50 value 80.375495
## iter  60 value 80.132843
## iter  70 value 79.964101
## iter  80 value 79.956992
## final  value 79.956945 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 111.539525
## iter  20 value 89.588201
## iter  30 value 80.121191
## iter  40 value 75.919458
## iter  50 value 75.044981
## iter  60 value 73.945793
## iter  70 value 73.388596
## iter  80 value 73.366783
## iter  90 value 73.361937
## iter 100 value 73.361277
## final  value 73.361277 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 111.659583
## iter  20 value 88.546844
## iter  30 value 77.166323
## iter  40 value 73.358533
## iter  50 value 70.440859
## iter  60 value 70.104681
## iter  70 value 69.914151
## iter  80 value 69.844705
## iter  90 value 69.841288
## final  value 69.841274 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 106.109418
## iter  20 value 88.136923
## iter  30 value 81.751362
## iter  40 value 78.908201
## iter  50 value 77.549684
## iter  60 value 75.739793
## iter  70 value 73.681045
## iter  80 value 73.644420
## iter  90 value 73.644157
## iter  90 value 73.644157
## iter  90 value 73.644157
## final  value 73.644157 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.834940
## iter  20 value 92.904347
## iter  30 value 78.910443
## iter  40 value 72.955136
## iter  50 value 70.300884
## iter  60 value 67.302888
## iter  70 value 67.165442
## iter  80 value 67.163892
## final  value 67.163878 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 105.898556
## iter  20 value 83.572466
## iter  30 value 72.834885
## iter  40 value 65.423939
## iter  50 value 63.355807
## iter  60 value 60.364799
## iter  70 value 60.179742
## iter  80 value 60.116301
## iter  90 value 60.113604
## final  value 60.113595 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 103.026402
## iter  20 value 84.901359
## iter  30 value 76.641830
## iter  40 value 74.293284
## iter  50 value 73.646947
## iter  60 value 73.100368
## iter  70 value 73.076410
## final  value 73.076160 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 115.050870
## iter  20 value 89.213388
## iter  30 value 79.470695
## iter  40 value 74.990960
## iter  50 value 73.233677
## iter  60 value 72.327003
## iter  70 value 71.653127
## iter  80 value 71.463471
## iter  90 value 71.314456
## iter 100 value 71.122634
## final  value 71.122634 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.650756
## iter  20 value 94.696403
## iter  30 value 87.466736
## iter  40 value 84.707009
## iter  50 value 83.332745
## iter  60 value 82.809508
## iter  70 value 82.758117
## iter  80 value 82.611927
## iter  90 value 82.543422
## iter 100 value 82.542280
## final  value 82.542280 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 104.863290
## iter  20 value 79.813464
## iter  30 value 70.767185
## iter  40 value 68.214571
## iter  50 value 67.913706
## iter  60 value 67.743541
## iter  70 value 67.685024
## iter  80 value 67.683153
## iter  90 value 67.682749
## final  value 67.682747 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.968202
## iter  20 value 91.927186
## iter  30 value 86.209894
## iter  40 value 81.847332
## iter  50 value 79.865441
## iter  60 value 78.752796
## iter  70 value 78.357098
## iter  80 value 78.236842
## iter  90 value 77.843367
## iter 100 value 77.779479
## final  value 77.779479 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 107.682854
## iter  20 value 86.790961
## iter  30 value 75.867370
## iter  40 value 73.214932
## iter  50 value 72.461292
## iter  60 value 72.283360
## iter  70 value 72.113912
## iter  80 value 72.083625
## iter  90 value 72.082603
## final  value 72.082594 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 116.921748
## iter  20 value 101.187423
## iter  30 value 87.835095
## iter  40 value 85.738123
## iter  50 value 83.031628
## iter  60 value 82.406848
## iter  70 value 80.934453
## iter  80 value 80.875106
## iter  90 value 80.873874
## final  value 80.873870 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 110.068439
## iter  20 value 87.184183
## iter  30 value 79.867598
## iter  40 value 77.589042
## iter  50 value 76.646935
## iter  60 value 76.490185
## iter  70 value 76.466830
## iter  80 value 76.415050
## iter  90 value 76.404695
## iter 100 value 76.401385
## final  value 76.401385 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 109.623554
## iter  20 value 91.060961
## iter  30 value 80.067669
## iter  40 value 77.719791
## iter  50 value 76.082790
## iter  60 value 74.725559
## iter  70 value 73.875335
## iter  80 value 72.720678
## iter  90 value 72.618708
## iter 100 value 72.617987
## final  value 72.617987 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 100.001774
## iter  20 value 76.976281
## iter  30 value 69.213245
## iter  40 value 66.822304
## iter  50 value 66.210110
## iter  60 value 65.799545
## iter  70 value 65.663015
## iter  80 value 65.655710
## final  value 65.655612 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 113.603020
## iter  20 value 92.145147
## iter  30 value 81.551488
## iter  40 value 79.272103
## iter  50 value 78.999120
## iter  60 value 78.658711
## iter  70 value 78.628566
## iter  80 value 78.627897
## final  value 78.627894 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 115.099585
## iter  20 value 99.994099
## iter  30 value 89.280915
## iter  40 value 87.746722
## iter  50 value 87.354016
## iter  60 value 87.100266
## iter  70 value 87.056230
## iter  80 value 87.012946
## iter  90 value 86.971739
## iter 100 value 86.948430
## final  value 86.948430 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 105.887167
## iter  20 value 89.587226
## iter  30 value 75.987140
## iter  40 value 71.028283
## iter  50 value 68.016737
## iter  60 value 67.821283
## iter  70 value 67.788172
## iter  80 value 67.784768
## final  value 67.784732 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 111.373241
## iter  20 value 92.412739
## iter  30 value 76.031895
## iter  40 value 72.635588
## iter  50 value 72.179988
## iter  60 value 71.391441
## iter  70 value 71.346763
## iter  80 value 71.343389
## final  value 71.343350 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 101.634569
## iter  20 value 78.435994
## iter  30 value 68.582971
## iter  40 value 67.243393
## iter  50 value 66.424862
## iter  60 value 66.312273
## iter  70 value 66.224174
## iter  80 value 66.209791
## iter  90 value 66.207192
## final  value 66.207118 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 114.649626
## iter  20 value 92.414928
## iter  30 value 82.313675
## iter  40 value 78.431277
## iter  50 value 76.640416
## iter  60 value 75.724242
## iter  70 value 74.867939
## iter  80 value 74.258564
## iter  90 value 74.111799
## iter 100 value 74.002829
## final  value 74.002829 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 119.107212
## iter  20 value 101.659353
## iter  30 value 91.150332
## iter  40 value 86.679196
## iter  50 value 86.043970
## iter  60 value 85.037744
## iter  70 value 84.681229
## iter  80 value 84.349387
## iter  90 value 84.191268
## iter 100 value 84.095293
## final  value 84.095293 
## stopped after 100 iterations
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 104.796041
## iter  20 value 85.624440
## iter  30 value 75.211443
## iter  40 value 73.502666
## iter  50 value 73.066401
## iter  60 value 72.464563
## iter  70 value 72.371453
## iter  80 value 72.364141
## final  value 72.363367 
## converged
## # weights:  66 (50 variable)
## initial  value 266.972161 
## iter  10 value 108.156434
## iter  20 value 85.381992
## iter  30 value 76.609082
## iter  40 value 74.697503
## iter  50 value 74.119854
## iter  60 value 73.941301
## iter  70 value 73.937328
## final  value 73.937305 
## converged
fgl.mlogit.cv
##   [1] 0.5846154 0.5846154 0.7076923 0.6153846 0.6153846 0.6769231 0.6000000
##   [8] 0.6000000 0.6615385 0.6461538 0.5846154 0.6153846 0.6615385 0.6153846
##  [15] 0.5846154 0.5538462 0.6307692 0.5846154 0.5384615 0.6461538 0.4307692
##  [22] 0.6769231 0.6923077 0.5846154 0.6307692 0.6153846 0.5846154 0.5538462
##  [29] 0.6000000 0.5692308 0.6461538 0.5846154 0.6769231 0.6153846 0.7538462
##  [36] 0.5692308 0.6769231 0.6153846 0.5692308 0.5538462 0.6000000 0.6307692
##  [43] 0.6153846 0.5384615 0.6307692 0.5538462 0.6000000 0.5230769 0.5846154
##  [50] 0.5230769 0.6461538 0.6615385 0.6000000 0.6923077 0.5692308 0.5538462
##  [57] 0.5846154 0.6461538 0.5692308 0.6153846 0.7384615 0.6153846 0.5538462
##  [64] 0.6000000 0.5692308 0.6307692 0.5538462 0.6461538 0.6153846 0.6000000
##  [71] 0.6153846 0.4615385 0.6769231 0.6307692 0.6000000 0.6923077 0.6307692
##  [78] 0.6153846 0.6153846 0.5538462 0.5692308 0.6615385 0.5384615 0.5846154
##  [85] 0.6000000 0.6615385 0.6153846 0.6307692 0.6769231 0.6461538 0.5538462
##  [92] 0.5384615 0.7076923 0.7076923 0.5384615 0.5692308 0.6153846 0.6769231
##  [99] 0.5076923 0.6307692
summary(fgl.mlogit.cv)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.4308  0.5692  0.6154  0.6089  0.6462  0.7538
  • 결과
    • 100개의 예측 정확도가 저장됐고, 요약통계량이 산출됨
    • 최소 46.1% 에서 최대 72.3% 까지 예측정확도가 나옴
    • 평균적으로 61% 정도의 예측 정확도를 보여줌
  • 이를 그래프로 시각화함
boxplot(fgl.mlogit.cv, horizontal=TRUE, 
        col="tomato", xlab="Accuracy", 
        main="Accuracy for Forensic Glass (100 samples)")
  • 결과: 예측정확도에 분포를 상자도표로 표현함

 

 

+ Recent posts