來源:金融民工新語
作者:劉新宇
NO.1 |問題描述:
(1)簡單的描述性統計:均值、中位數等
(2)求出多個變量的相關係數矩陣
(3)求出簡單多元線性回歸的係數
(4)求出常見的回歸描述量:例如中心化R方、調整後R方
NO.2 |數據來源:
數據採用的是Pieters & Bijmolt(1997)的關於Consumer Memory for Television Advertising調查結果。這並不是重點,其實就可以簡單理解為現在有一個橫截面數據:y是unaid,x包括dur、ncb、rank、year這四個變量,我們現在關心的就是y跑在四個解釋變量的多元回歸模型。
NO.3 |Matlab的實現過程
原始碼:
load('recall.mat')
mean(Y)
median(Y)
corrcoef([unaid,dur,ncb,rank,year])
%Calcalate the coefficients of regression
N=2677;
X=[dur,ncb,rank,year,ones(N,1)];
Y=unaid;
beta=inv(X'*X)*X'*Y;
%Calculate the R-squared
%Uncentered R-squared:
Ru=(Yhat'*Yhat)/(Y'*Y)
%Centered R-squared:
Rc=1-(e'*e)/((Y-mean(Y))'*(Y-mean(Y)))
%adjusted R-squared:
Ra=1-((1/(N-k))*(e'*e))/((1/(N-1))*(Y-mean(Y))'*(Y-mean(Y)))
Matlab導入文件的格式是*.dat文件,而實現回歸的過程其實是基於矩陣的計算:第一段使用的median/mean/corrcoef都是matlab內置的函數,直接就可以用於求回歸中比較常見的描述性統計、相關係數矩陣;第二段就是求beta_ols的步驟了,定義好X和Y後就直接計算即可,因為matlab是個專用於科學計算的軟體,因此矩陣相乘、求逆、轉置都很方便(一會你看看下面的Python就知道為什麼說matlab方便);第三段就是帶入求各種R方的過程了, 其中很有意思的是求某個列向量的平方和,其實是直接用它的轉置再乘自身。
Matlab計算的結果在下面的工作區都能找到:
NO.4 |Python的實現過程
原始碼:
from pandas import Series,DataFrame
import pandas as pd
import numpy as np
d=pd.read_excel('data.xlsx')
#(a)Calculate the mean/median/correlation coefficients
print('mean of unaid is',d.unaid.mean())
print('median of unaid is',d.unaid.median())
mat_of_data=d.corr()
print('Correlation coefficient matrix is as follows\n',mat_of_data)
#Basic linear regression
N=2677
X=DataFrame({'dur':d.dur,'ncb':d.ncb,'rank':d.ran,'year':d.year,'cons':1})
y=d.unaid
def beta_ols_cal(first,last):#To define a process of calculating Beta_OLS
A=np.dot(first.T,first)
B=np.dot(first.T,last)
D=np.dot(B,C)
return D
beta_ols=beta_ols_cal(X,y)
print('The coefficient of dur is ',beta_ols[1])
print('The coefficient of ncb is ',beta_ols[2])
print('The coefficient of rank is ',beta_ols[3])
print('The coefficient of year is ',beta_ols[4])
print('The coefficient of _constant is ',beta_ols[0])
#Calculate R-squared for the regression model
yhat=np.dot(X,beta_ols)
uhat=y-yhat
k=5
R_unc=sum(yhat**2)/sum(y**2)
R_c=1-sum(uhat**2)/sum((y-np.mean(y))**2)
R_adj=1-((1/(N-k))*sum(uhat**2))/((1/(N-1))*sum((y-np.mean(y))**2))
print('Uncentered-R is ',R_unc)
print('Centered-R is ',R_c)
print('adjusted-R is ',R_adj)
看代碼長度就知道Python是這三種軟體中最負責的一個,但為什麼還要用Python呢?因為Python本質是編程軟體,科學計算不如matlab、計量專業程度不如stata,但是在抓取網絡爬蟲、處理批量數據的時候也有它的優勢。第一點:Python可以導入的數據類型很多,最常見的excel文件都可以讀取。第二點:這段Python命令其實內容挺無聊的,值得提兩句的是:Python支持矩陣的計算其實並不多(許是我沒找到,因為剛學一會...),所以在中間計算的時候就很麻煩,相比於matlab的矩陣計算簡直要麻煩到天上了,當然常見的描述性統計還是有相關第三方庫的。第三點:Python實現平方和的過程是sum(x**2)跟matlab完全不同,但殊途同歸咯。
Python的結果就可以在IDLE中看到如下結果:
NO.5 |Stata的實現過程
原始碼:
use "\Desktop\recall.dta",clear
sum
corr
reg unaid dur ncb rank year
hhhhhhhh 簡直不能更短。所以說常見的回歸直接用stata是最方便的,它其實是用基本的編程軟體寫成的,所以直接顯示回歸各項結果,對於不從事理論計量的人來說Stata好用許多。Stata的回歸結果如下:會匯報各項常用回歸量:F-test值、t值、MSE、SSR、R方等等。
總結:人生苦短,我用Python;人生苦短,我用Matlab;人生苦短,我用Stata。
關注「雄安學術」公眾號