본문 바로가기
카테고리 없음

[STATA] 2차모형 / FP모형 / 단계적회귀

by e-money2580 2023. 2. 6.
반응형


** 2차 모형 추정

use "D:\STATA연습데이터\STATA기초통계와회귀분석\R_data15_1.dta",clear
// 종속변수인 임금(wage)이 독립변수인 근무연한(tenure)에 따라 증가하지만 일정수준 이상 근무연한이 증가하면 임금이 오히려 줄어들 수도 있다고 판단할 때 추정방법

gen tenure2=tenure^2 // tenure 변수의 2차항 변수 생성
gen lwage=ln(wage) // wage 변수에 로그값 취한 변수 생성

reg lwage tenure tenure2
/*
      Source |       SS           df       MS      Number of obs   =     2,231
-------------+----------------------------------   F(2, 2228)      =    121.85
       Model |  72.1938319         2  36.0969159   Prob > F        =    0.0000
    Residual |  660.023236     2,228  .296240232   R-squared       =    0.0986
-------------+----------------------------------   Adj R-squared   =    0.0978
       Total |  732.217068     2,230  .328348461   Root MSE        =    .54428

------------------------------------------------------------------------------
       lwage | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
      tenure |   .0610446   .0068122     8.96   0.000     .0476856    .0744035
     tenure2 |  -.0016852   .0003661    -4.60   0.000    -.0024031   -.0009673
       _cons |   1.619121   .0223875    72.32   0.000     1.575218    1.663023
------------------------------------------------------------------------------
*/
// 예상대로, tenure는 양의 계수, tenure2은 음의 계수가 나타남 
// = 근무연한 증가에 따라 임금은 높아지나, 근무기간이 일정수준 이상이 되면 오히려 임금이 낮아짐



** 임금이 낮아지기 시작하는 근무연한 계산

di -_b[tenure]/(2*_b[tenure2]) // (-)1차 설명변수의 추정계수 / (2 x 2차 설명변수의 추정계수)
// 18.112261
// 18.1년까지 임금이 높아지다가 그 이후로 낮아짐


** 근무연한의 표본평균 값에서 한계효과(근무기간이 1년 증가할 때 임금의 평균 증가분) 계산
su tenure if e(sample)==1
/*
    Variable |        Obs        Mean    Std. dev.       Min        Max
-------------+---------------------------------------------------------
      tenure |      2,231     5.97785    5.510331          0   25.91667
*/

di 2*_b[tenure2]*r(mean)+_b[tenure]
// .04089717
// 표본평균인 5.97년 근무한 직원이 1년 더 근무할 때 임금이 평균적으로 4.1% 증가

twoway (function y=_b[_cons]+_b[tenure]*x+_b[tenure2]*x^2, range(0 25)) (function y=_b[_cons]+_b[tenure]*x+_b[tenure2]*x^2, recast(area) range(18.1 18.1))
// 추정결과 적합선을 그래프로 그리기


** ttl_exp(이전 직장 경력까지 포함한 총 근무연한) 변수를 포함한 회귀추정

reg lwage tenure tenure2 ttl_exp

/*
      Source |       SS           df       MS      Number of obs   =     2,231
-------------+----------------------------------   F(3, 2227)      =    146.28
       Model |  120.534401         3  40.1781338   Prob > F        =    0.0000
    Residual |  611.682667     2,227  .274666667   R-squared       =    0.1646
-------------+----------------------------------   Adj R-squared   =    0.1635
       Total |  732.217068     2,230  .328348461   Root MSE        =    .52409

------------------------------------------------------------------------------
       lwage | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
      tenure |   .0441508   .0066819     6.61   0.000     .0310473    .0572543
     tenure2 |  -.0017963   .0003526    -5.09   0.000    -.0024878   -.0011049
     ttl_exp |   .0391351   .0029499    13.27   0.000     .0333501      .04492
       _cons |   1.236119   .0360303    34.31   0.000     1.165463    1.306776
------------------------------------------------------------------------------
*/


su ttl_exp if e(sample)==1
/*
    Variable |        Obs        Mean    Std. dev.       Min        Max
-------------+---------------------------------------------------------
     ttl_exp |      2,231    12.55485    4.606011   .1153846   28.88461
*/

di -_b[tenure]/(2*_b[tenure2])
// 12.289265
// 경력이 12.28년일 때 임금예측값은 최대가 됨

twoway (function y=_b[_cons]+_b[tenure]*x+_b[tenure2]*x^2+_b[ttl_exp]*12.55, range(0 25)) (function y=_b[_cons]+_b[tenure]*x+_b[tenure2]*x^2 + _b[ttl_exp]*12.55, recast(area) range(12.28 12.28))

//추정결과를 이용하여 근무연한에 따른 임금예측값 그래프 그리기



** 상기 2차항 모형에서 tenure와 tenure2의 다중공선성 확인하기

reg lwage tenure tenure2
corr tenure tenure2 if e(sample)==1
/* (obs=2,231)

             |   tenure  tenure2
-------------+------------------
      tenure |   1.0000
     tenure2 |   0.9517   1.0000
*/
// 상관관계가 0.95로 1에 가까움

vif
/*

    Variable |       VIF       1/VIF  
-------------+----------------------
      tenure |     10.61    0.094277
     tenure2 |     10.61    0.094277
-------------+----------------------
    Mean VIF |     10.61
*/
// VIF 값이 10보다 크므로 다중공선성 문제가 있음
// 2차 모형에서는 목적이 주어진 데이터의 적합성이나 예측에 있으므로 다중공선성은 큰 문제가 되지 않음


** 2차 모형에서 다중공선성 문제를 해결하면서 추정하는 방법

su tenure if e(sample)==1
/*
    Variable |        Obs        Mean    Std. dev.       Min        Max
-------------+---------------------------------------------------------
      tenure |      2,231     5.97785    5.510331          0   25.91667
*/

gen tenure_d=tenure-r(mean) // 근무연한에서 평균을 차감한 변수 생성

gen tenure_d2=tenure_d^2 // 근무연한에서 평균을 차감한 값을 제곱한 변수 생성

reg wage tenure_d tenure_d2
/*
      Source |       SS           df       MS      Number of obs   =     2,231
-------------+----------------------------------   F(2, 2228)      =     39.14
       Model |  2514.91564         2  1257.45782   Prob > F        =    0.0000
    Residual |   71586.912     2,228  32.1305709   R-squared       =    0.0339
-------------+----------------------------------   Adj R-squared   =    0.0331
       Total |  74101.8276     2,230  33.2295191   Root MSE        =    5.6684

------------------------------------------------------------------------------
        wage | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
    tenure_d |   .2371488   .0309152     7.67   0.000     .1765231    .2977745
   tenure_d2 |  -.0089112   .0038125    -2.34   0.020    -.0163877   -.0014347
       _cons |   8.062904   .1667062    48.37   0.000     7.735989     8.38982
------------------------------------------------------------------------------
*/

vif
/*
    Variable |       VIF       1/VIF  
-------------+----------------------
    tenure_d |      2.01    0.496493
   tenure_d2 |      2.01    0.496493
-------------+----------------------
    Mean VIF |      2.01
*/
// VIF 값이 2차항을 사용한 모형의 VIF(10.61)보다 훨씬 줄어들고 10보다도 작음



** FP (fractional polynomial) 모형 : 설명변수와 종속변수의 적합도를 높이기 위한 모형, 특히 설명변수와 종속변수 간 알려지지 않은 비선형관계를 가정할 때 사용

use "D:\STATA연습데이터\STATA기초통계와회귀분석\R_data15_2.dta", clear
// 종속변수 : sqrtigg, 독립변수 age

fracpoly reg sqrtigg age, adjust(no)
// 회귀모형 : sqrtigg = b0 + b1 x age^(-2) + b2 x age^2 + e
// 차수에 대한 옵션을 지정하지 않으면 차수는 자동으로 2로 설졍됨 (독립변수 항이 2개)

/*
........
-> gen double Iage__1 = age^-2 if e(sample)
-> gen double Iage__2 = age^2 if e(sample)

      Source |       SS           df       MS      Number of obs   =       298
-------------+----------------------------------   F(2, 295)       =     64.49
       Model |  22.2846976         2  11.1423488   Prob > F        =    0.0000
    Residual |  50.9676492       295  .172771692   R-squared       =    0.3042
-------------+----------------------------------   Adj R-squared   =    0.2995
       Total |  73.2523469       297  .246640898   Root MSE        =    .41566

------------------------------------------------------------------------------
     sqrtigg | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
     Iage__1 |  -.1562156    .027416    -5.70   0.000    -.2101713     -.10226
     Iage__2 |   .0148405   .0027767     5.34   0.000     .0093757    .0203052
       _cons |   2.189242   .0473835    46.20   0.000     2.095989    2.282495
------------------------------------------------------------------------------
Deviance = 319.45. Best powers of age among 44 models fit: -2 2.
*/

fracpoly reg sqrtigg age, degree(3) adjust(no)
// 회귀모형 : sqrtigg = b0 + b1 x age^(-2) + b2 x age + b3 x (age x lnage) + e
// 차수를 3으로 설정(독립변수 항이 3개)

/*
............................................
-> gen double Iage__1 = age^-2 if e(sample)
-> gen double Iage__2 = age if e(sample)
-> gen double Iage__3 = age*ln(age) if e(sample)

      Source |       SS           df       MS      Number of obs   =       298
-------------+----------------------------------   F(3, 294)       =     42.93
       Model |  22.3143361         3  7.43811203   Prob > F        =    0.0000
    Residual |  50.9380108       294   .17325854   R-squared       =    0.3046
-------------+----------------------------------   Adj R-squared   =    0.2975
       Total |  73.2523469       297  .246640898   Root MSE        =    .41624

------------------------------------------------------------------------------
     sqrtigg | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
     Iage__1 |  -.1836081   .0527827    -3.48   0.001     -.287488   -.0797283
     Iage__2 |  -.1704955   .2065316    -0.83   0.410    -.5769632    .2359722
     Iage__3 |   .1242667   .0944355     1.32   0.189    -.0615885    .3101219
       _cons |   2.417309   .2892418     8.36   0.000     1.848063    2.986556
------------------------------------------------------------------------------
Deviance = 319.28. Best powers of age among 164 models fit: -2 1 1.
*/

// 앞서 차수 2인 경우 deviance가 319.45, 차수 3인 경우 deviance가 319.28로 큰 차이 없으므로, 차수를 늘리더라도 deviance에는 큰 차이가 없음을 알 수 있음

** FP 모형 추정결과 그래프로 그리기
fracpoly reg sqrtigg age, adjust(no)
fracplot

** FP 모형을 추정하지 않고도 바로 그래프 그리기
twoway (scatter sqrtigg age) (fpfit sqrtigg age)

** 회귀선에 신뢰구간을 포함하여 그래프 그리기
twoway (scatter sqrtigg age) (fpfitci sqrtigg age)

** 명령어 순서를 바꾸면(회귀선 그린 후 산포도 그림) 신뢰구간 안의 산포도 점들이 표현됨)
twoway (fpfitci sqrtigg age) (scatter sqrtigg age)


** 단계적 회귀 : 사전에 주어진 이론적 모형이 없거나 많은 설명변수 중 어떤 변수를 모형에 포함해야 할지 결정하기 힘들때 사용

use "D:\STATA연습데이터\STATA기초통계와회귀분석\R_data15_3.dta", clear
// female : 성별더미변수, ses : 사회경제적 수준, schtyp : 학교유형, read : 독해 성적, write : 작문 성적, math : 수학 성적, science : 과학 성적, socst : 사회 성적 
// 이 때, 학생들의 작문 성적을 결정하는 모형을 추정
// 설명변수 후보로 read, science, female 3개 변수를 이용하여 단계적 회귀 추정

stepwise, pr(0.05): reg write read science female

// pr(0.05) : 단계적으로 추정하면서 설명변수가 5% 수준에서 유의하면 모형에 잔류시키고 그렇지 않으면 제외
// 변수가 가장 많은 모형에서 출발하여 유의하지 않은 변수를 하나씩 줄여 나감 

/*
Wald test, begin with full model:
p < 0.0500 for all terms in model

      Source |       SS           df       MS      Number of obs   =       200
-------------+----------------------------------   F(3, 196)       =     71.38
       Model |  9334.79206         3  3111.59735   Prob > F        =    0.0000
    Residual |  8544.08294       196  43.5922599   R-squared       =    0.5221
-------------+----------------------------------   Adj R-squared   =    0.5148
       Total |   17878.875       199   89.843593   Root MSE        =    6.6024

------------------------------------------------------------------------------
       write | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
        read |   .3502515   .0588277     5.95   0.000     .2342349    .4662682
     science |   .3572054   .0613361     5.82   0.000     .2362419    .4781688
      female |   6.156789   .9458754     6.51   0.000     4.291389    8.022189
       _cons |   12.60481   2.832622     4.45   0.000     7.018484    18.19114
------------------------------------------------------------------------------
*/
// 3개 변수 모두 5% 수준에서 유의하므로 모형에 잔류하였음

stepwise, pe(0.05): reg write read science female

// pe(0.05) : 변수가 가장 적은 모형에서 출발하여 5% 수준에서 유의한 변수들을 하나씩 추가
/*
Wald test, begin with empty model:
p = 0.0000 <  0.0500, adding read
p = 0.0000 <  0.0500, adding female
p = 0.0000 <  0.0500, adding science

      Source |       SS           df       MS      Number of obs   =       200
-------------+----------------------------------   F(3, 196)       =     71.38
       Model |  9334.79206         3  3111.59735   Prob > F        =    0.0000
    Residual |  8544.08294       196  43.5922599   R-squared       =    0.5221
-------------+----------------------------------   Adj R-squared   =    0.5148
       Total |   17878.875       199   89.843593   Root MSE        =    6.6024

------------------------------------------------------------------------------
       write | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
        read |   .3502515   .0588277     5.95   0.000     .2342349    .4662682
      female |   6.156789   .9458754     6.51   0.000     4.291389    8.022189
     science |   .3572054   .0613361     5.82   0.000     .2362419    .4781688
       _cons |   12.60481   2.832622     4.45   0.000     7.018484    18.19114
------------------------------------------------------------------------------
*/
// 결론적으로는 pr과 pe 옵션의 결과가 같으나 경우에 따라 다른 결과가 도출될 수 있음

xi: stepwise, pr(0.05): reg write i.ses read science female

// 범주가 3개인 ses 변수에 대해 더미변수를 생성하여 단계적 회귀 추정

/*
i.ses             _Ises_1-3           (naturally coded; _Ises_1 omitted)

Wald test, begin with full model:
p = 0.9008 >= 0.0500, removing _Ises_2
p = 0.3664 >= 0.0500, removing _Ises_3

      Source |       SS           df       MS      Number of obs   =       200
-------------+----------------------------------   F(3, 196)       =     71.38
       Model |  9334.79206         3  3111.59735   Prob > F        =    0.0000
    Residual |  8544.08294       196  43.5922599   R-squared       =    0.5221
-------------+----------------------------------   Adj R-squared   =    0.5148
       Total |   17878.875       199   89.843593   Root MSE        =    6.6024

------------------------------------------------------------------------------
       write | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
      female |   6.156789   .9458754     6.51   0.000     4.291389    8.022189
     science |   .3572054   .0613361     5.82   0.000     .2362419    .4781688
        read |   .3502515   .0588277     5.95   0.000     .2342349    .4662682
       _cons |   12.60481   2.832622     4.45   0.000     7.018484    18.19114
------------------------------------------------------------------------------
*/
// 범주가 3개이지만 독립변수간 완전한 선형관계(완전한 상관관계)를 피하기 위해 2개의 더미변수가 생성됨 : _Ises_2, _Ises_3
// _Ises_2, _Ises_3 더미변수 모두 단계적 회귀 추정 과정에서 5% 유의수준에서 유의성이 없는 것으로 판단하여 제외

xi: by schtyp, sort: stepwise, pr(0.05): reg write i.ses read science female
// schtyp(학교종류)별로 단계적 회귀 실행
/*
-> schtyp = public

Wald test, begin with full model:
p = 0.7340 >= 0.0500, removing _Ises_3
p = 0.4008 >= 0.0500, removing _Ises_2

      Source |       SS           df       MS      Number of obs   =       168
-------------+----------------------------------   F(3, 164)       =     62.92
       Model |  8556.74416         3  2852.24805   Prob > F        =    0.0000
    Residual |  7434.75584       164  45.3338771   R-squared       =    0.5351
-------------+----------------------------------   Adj R-squared   =    0.5266
       Total |     15991.5       167   95.757485   Root MSE        =     6.733

------------------------------------------------------------------------------
       write | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
     science |   .3262883   .0669643     4.87   0.000     .1940651    .4585116
      female |   6.464022   1.050489     6.15   0.000     4.389796    8.538249
        read |    .386751   .0651049     5.94   0.000     .2581991    .5153028
       _cons |    11.8703   3.049246     3.89   0.000      5.84946    17.89114
------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------
-> schtyp = private

Wald test, begin with full model:
p = 0.7619 >= 0.0500, removing _Ises_2
p = 0.5831 >= 0.0500, removing _Ises_3
p = 0.4197 >= 0.0500, removing read

      Source |       SS           df       MS      Number of obs   =        32
-------------+----------------------------------   F(2, 29)        =     11.45
       Model |  705.224686         2  352.612343   Prob > F        =    0.0002
    Residual |  892.744064        29  30.7842781   R-squared       =    0.4413
-------------+----------------------------------   Adj R-squared   =    0.4028
       Total |  1597.96875        31   51.547379   Root MSE        =    5.5484

------------------------------------------------------------------------------
       write | Coefficient  Std. err.      t    P>|t|     [95% conf. interval]
-------------+----------------------------------------------------------------
      female |   4.249731   2.024955     2.10   0.045     .1082345    8.391228
     science |   .5802402   .1246911     4.65   0.000     .3252183    .8352621
       _cons |   22.20672   7.051318     3.15   0.004     7.785157    36.62829
------------------------------------------------------------------------------

*/
// 공립학교(public)의 경우 ses 변수가 최종 모형에서 제외되었고 사립학교(private)인 경우 ses 변수와 read 변수도 최종 모형에서 제외됨

 

[출처]  기초통계와 회귀분석(민인식, 최필선, 2012), 한국STATA학회 홈페이지(http://kastata.org/html/sub02-04.asp)

반응형

댓글