Riešené príklady

Ekonometria

Máme dané hodnoty časových radov Yt, Xt1, Xt2 , ktoré sa menia v čase t. Zistite vzťah závislosti Yt od Xt1 a Xt2, overte predpoklady o náhodnej zložke (autokorelácia, heteroskedasticita, multikolinearita) a v prípade potreby upravte model na vhodnejší.

Yt<-c(210, 212, 214, 212, 215, 216, 217, 218, 220, 222, 223, 224, 226, 225, 228)
Xt1<-c(36, 42, 62, 50, 64, 72, 75, 87, 94, 85, 104, 107, 134, 115, 150)
Xt2<-c(150, 165, 162, 170, 94, 90, 90, 90, 90, 75, 75, 75, 40, 70, 15)  

Lineárna regresia
Na výpočet koeficientov použijeme vlastnú funkciu:

reg = function (Yt, m)
  {
    regr = lm (Yt~m)
    nr = nrow(m)
    nc = ncol(m)
    y = c()
    b = c()   
    for (i in 1:(nc+1))
    {
      b[i]=regr$coef[i]
    }    
    for (i in 1:nr)
    {
      ypom = 0;
      for (j in 2:(nc+1))
      {
        ypom = ypom + b[j]*m[i,(j-1)]
      }
      y[i]=b[1]+ypom
    }
    plot (Yt, type = "o", col="green",xlab="cas t",ylab="hodnoty y",
 main = "Linearna regresia")
    lines (y, type = "o", col="red")
    cat("Linear regresion",<br />,
      "--------------------------------------",<br />,
      "Estimated values of Y:<br />,y,<br />,
      "--------------------------------------",<br />,
      "Summary from lm function:",<br />
    )
    summary (regr)
  }

Teraz do tejto funkcie vložíme naše premenné a počkáme si na výstup.

reg(Yt,cbind (Xt1,Xt2))

Náš výstup vyzerá nasledovne:

Linear regresion
--------------------------------------
Estimated values of Y:

210.6884 211.358 214.3811 212.4747 215.6937 216.9447 217.3915 219.1785 220.2209 219.1045 221.9339 222.3806 226.9236 223.6465 229.6793

--------------------------------------

Summary from lm function:

Call:
lm(formula = Yt ~ m)

Residuals:
Min 1Q Median 3Q Max
-1.6793 -0.8087 -0.3915 0.8541 2.8955

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 207.56608 4.07526 50.933 2.15e-15 ***
mXt1 0.14891 0.02683 5.549 0.000126 ***
mXt2 -0.01492 0.01929 -0.774 0.454194
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.35 on 12 degrees of freedom
Multiple R-squared: 0.9514, Adjusted R-squared: 0.9434
F-statistic: 117.6 on 2 and 12 DF, p-value: 1.311e-08

komplexny-priklad

Autokorelácia
Zistime si prítomnosť autokorelácie pomocou funkcie durbinWatsonTest(), na ktorú potrebujeme načítať knižnicu “car”. Knižnicu si vieme načítať podľa návodu tu: Knižnice

regresia = lm(Yt ~ cbind(Xt1,Xt2))
dw<-durbinWatsonTest(regresia,max.lag=1)
dw

Výstup z tejto funkcie vyzerá nasledovne:

lag Autocorrelation D-W Statistic p-value
1 0.03318988 1.782994 0.36
Alternative hypothesis: rho != 0

Keďže rho je blízke 0, autokorelácia nie je prítomná.

Heteroskedasticita
Na zistenie heteroskedasticity použijeme Bartlettov test.

data<-list(Yt,Xt1,Xt2)
bartlett.test(data)

Program nám vygeneruje nasledovné:

Bartlett test of homogeneity of variances

data: data
Bartlett's K-squared = 38.279, df = 2, p-value = 4.873e-09

Ftab = 9,3. B-test hodnota je väčšia ako tabuľková, teda zamietam nulovú hypotézu , z čoho vyplýva, že je tam pozitívna heteroskedasticita.

Pre odstránenie heterokedasticity potrebujeme knižnicu “Imtest”, ktorá obsahuje funkciu “gqtest”. Knižnicu si vieme načítať podľa návodu tu: Knižnice

Yt1<-1 
for (i in 1:15)
{
Yt1[i]<-(Yt[i]/Xt2[i])
 }
Xt<-1
for (i in 1:15)
{
Xt[i]<-(Xt1[i]/Xt2[i])
}
mat1 = cbind(Yt1, Xt, Xt2)
model1<-(Yt1 ~ Xt + Xt2)
regresia1<-lm(model1)
gqtest(regresia1, order.by = Xt2, fraction=2, data = mat1)

R nám vygeneruje nasledovné:

Goldfeld-Quandt test

data: regresia1
GQ = 0.0217, df1 = 4, df2 = 3, p-value = 0.9985

Ftab=9,3. GQ hodnota je menšia ako tabuľková, heteroskedasticitu sa nám podarilo odstrániť.

Multikolinearita
Pre zistenie multikolinearity je potrebné si najskôr vytvoriť výstupnú a korelačnú maticu z Xt1 a Xt2.

vys_mat=cbind(Xt1,Xt2)
kor_mat=cor(vys_mat)

Následne si vytvoríme funkciu:

fgtest = function(vn,cor_mat)
{
dof_cor=dim(cor_mat)[1] #počet stupňov voľnosti
chi_sq_cal=((-1)*(length(vn)-1-(2*dof_cor+5)/6)*log(det(cor_mat))) #chi^2
chi_sq_tab=qchisq(0.95,1/2*dof_cor*(dof_cor-1)) #chi^2 tab hodnota
if(chi_sq_cal>chi_sq_tab) #ak je vypočítaná väčšia ako tab, zamietam h0
cat("multikolinearita je významná")
else
cat("multikolinearita nie je významná")
} 

A túto funkciu aj použijeme s našimi hodnotami:

fgtest(Xt1,kor_mat)

Výstup je jednoducho zrozumiteľný:

multikolinearita je významná

Pre odstránenie multikolinearity využijeme vlastné vektory.

cor_mat = cor(cbind(Xt1,Xt2))
eig_mat= eigen(cor_mat)
sd1=function(a) {
     p=mean(a);
     n=length(a);
     i=1;
     b=0;
     while(i<=n){
          b[i]=c((a[i]-p)^2)
          i=i+1
};
     return(sqrt(sum(b)/n))
}

nXt1=(Xt1-mean(Xt1))/sd1(Xt1)
nXt2=(Xt2-mean(Xt2))/sd1(Xt2)
mhk=cbind(nXt1,nXt2) %*% eig_mat$vectors
mhk

Matica hlavných komponentov vyzerá nasledovne:

Comp.1 Comp.2
[1,] 1.9440595 0.24092255
[2,] 2.0504516 -0.13229224
[3,] 1.5577862 -0.52903619
[4,] 1.9525042 -0.39010855
[5,] 0.4262071 0.51360207
[6,] 0.1843776 0.39966779
[7,] 0.1176719 0.33296209
[8,] -0.1491508 0.06613931
[9,] -0.3047975 -0.08950731
[10,] -0.3444838 0.35041317
[11,] -0.7669532 -0.07205623
[12,] -0.8336589 -0.13876192
[13,] -1.9935514 -0.17957192
[14,] -1.0914752 -0.23670931
[15,] -2.7489874 -0.13566331

    Po odstránení multikolinearity, poďme skontrolovať náš model a porovnať s pôvodnými hodnotami. Na vytvorenie modelu potrebujeme vybrať vektory z matice mhk, môžeme ich pomenovať A a B. Následne potrebujeme normovať pôvodné Yt na nYt. Nakoniec opäť použijeme našu funkciu reg().

    A<-mhk[,1]
    B<-mhk[,2]
    nYt=(Yt-mean(Yt))/sd1(Yt)
    reg(nYt,cbind (A,B))
    

    Dostaneme nasledovný výstup:

    Linear regresion
    --------------------------------------
    Estimated values of Y:
    -1.48031 -1.358108 -0.8064217 -1.154319 -0.5668711 -0.3385706 -0.2570431 0.0690665 0.2592971 0.05556761 0.5719079 0.6534353 1.482505 0.8844593 1.985406
    --------------------------------------
    Summary from lm function:

    Call:
    lm(formula = Yt ~ m)

    Residuals:
    Min 1Q Median 3Q Max
    -0.30647 -0.14758 -0.07144 0.15586 0.52841

    Coefficients:
    Estimate Std. Error t value Pr(>|t|)
    (Intercept) -1.951e-15 6.361e-02 0.000 1.0000
    mA -6.963e-01 4.599e-02 -15.139 3.5e-09 ***
    mB -5.259e-01 2.154e-01 -2.442 0.0311 *
    ---
    Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

    Residual standard error: 0.2464 on 12 degrees of freedom
    Multiple R-squared: 0.9514, Adjusted R-squared: 0.9434
    F-statistic: 117.6 on 2 and 12 DF, p-value: 1.311e-08

    regresia-nova

    Zistili sme, že po odstránení multikolinearity má model menšiu chybu (Residual standard error). Pôvodná chyba bola 1.35 a teraz je už len 0.2464. Tento fakt si môžeme všimnúť aj na grafe. Preto upravený model je viac vhodný na modelovanie či prognózovanie ako pôvodný.

    Nový model má rovnicu:
    nYt= -1.951e-15- 6.963e-01*A- 5.259e-01*B + ut

    Prognostika

Comments are closed.