热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

StudynoteonAppliedEconometricswithR(1)

这是我根据AppliedEconometricswithR(springer)一书中线性回归(第三章)有关内容整理成的学习笔记,对书中的一些代码进行了解读,也根据

           这是我根据Applied Econometrics with R(springer)一书中线性回归(第三章)有关内容整理成的学习笔记,对书中的一些代码进行了解读,也根据我学到的回归知识添加了部分内容。笔记中的例子凡是书上给出过输出结果的,在这里一律省略,没给出结果的,附上结果及函数解读。这个并不是书内容的翻译,与原书有一定的出入。

Chapter 3:线性模型

需要加载函数包: AER

章节目录

3.1 简单线性模型

3.2 多变量线性模型

3.3 半线性模型

3.4 因子、交互作用、加权最小二乘

3.5 时间序列的回归

3.6 面板数据的回归

3.7 线性方程组


3.1 简单线性模型

例1:一元线性模型

数据集: journals

模型 log(subs)=β1+β2*log(citeprice)+ e

使用代码:

1)  了解数据集的基本情况

library(AER)
data("Journals")
journals <- Journals[, c("subs","price")]
journals$citeprice <- Journals$price/Journals$citations#定义新变量citeprice
summary(journals)

对数据进行基本的了解,在Hmisc,psych包中的describe函数提供了诸如离差,极差,峰度,偏度,数据量,缺失数等诸多统计量的统计结果,运行以下代码:

library(psych)
describe(journals)

输出结果:


判断数据是否具有一定的线性性,我们可以使用最直观的办法画图来做初步判断,代码如下:

plot(log(subs) ~ log(citeprice),data = journals)
jour_lm <- lm(log(subs) ~log(citeprice), data = journals)
abline(jour_lm)

可以得到图3.1,据此可初步判断数据间具有相关性,当然cor.test()也可以做到这一点,运行cor.test(journals$subs,journals$citeprice),有以下结果:

Pearson'sproduct-moment correlation

data:  journals$subs and journals$citeprice

t = -6.1661,       df = 178 ,     p-value = 4.57e-09

alternative hypothesis: truecorrelation is not equal to 0

95 percent confidenceinterval:  -0.5330837   -0.2911326

sample estimates:              cor :   -0.4195314

2)  线性回归模型建立

  

 jour_lm <-lm(log(subs) ~ log(citeprice), data = journals)

回归模型的大部分结果都可以通过summary函数进行查看,运行summary(jour_lm)即可,也有一些函数供你查看模型的特定部分

函数

描述

Summary

标准回归结果输出

Coef

提取回归系数

Residuals

提取回归残差

Fitted

提取拟合数据

Anova

与参考模型(nested model)进行对比

Predict

对新数据进行预测

Plot

诊断图

Confint

回归系数置信区间

Deviance

残差平方和

Vcov

同方差假定下的协方差阵。注:异方差下使用car包的hccm函数

logLik

正态假设下的最大似然值

AIC

AIC

 

3)  系数显著性检验

anova(jour_lm)

对于单变量回归来说,方差分析仅对系数的显著性做了检验,返回值为回归模型输出里的F统计量,但输出格式还是更接近方差分析的标准

4)  系数的区间估计

  

  confint(jour_lm, level = 0.95)

5)  预测

  

  predict(jour_lm, newdata =data.frame(citeprice = 2.11),interval = "confidence")
   predict(jour_lm, newdata =data.frame(citeprice = 2.11),interval = "prediction")

对于prediction中interval参数,在之前的博文《R 语言与简单的回归分析》中已有说明,运行下列代码可以使你更好地理解他们:

lciteprice <- seq(from = -6, to= 4, by = 0.25)
jour_pred <- predict(jour_lm,interval = "prediction",
+newdata = data.frame(citeprice =exp(lciteprice)))
jour_pred1<- predict(jour_lm,interval = "confidence",
+newdata = data.frame(citeprice =exp(lciteprice)))
plot(log(subs) ~ log(citeprice),data = journals)
lines(jour_pred[, 1] ~ lciteprice,col = 1)
lines(jour_pred[, 2] ~ lciteprice,col = 1, lty = 2)
lines(jour_pred[, 3] ~ lciteprice,col = 1, lty = 2)
lines(jour_pred1[, 1] ~ lciteprice,col = 2)
lines(jour_pred1[, 2] ~ lciteprice,col = 2, lty = 3)
lines(jour_pred1[, 3] ~ lciteprice,col = 2, lty = 3)

输出图像略。

6)  回归效果检测图

  plot(jour_lm)即可,如果只需要四幅图中的一幅,which参数可以帮你指定

7)  系数的假设检验

     比如我们想检测log(citeprice)回归系数是否为0.5,运行代码:

linearHypothesis(jour_lm,"log(citeprice) = -0.5")

      函数的进一步说明:例如,如果我们有一个包括常数项的五个参数的模型,并且我们的零假设如下:

β1=0   且  β3+β4=1

    我们可以用如下的命令加以实现

unrestricted<-lm(y~x1+x2+x3+x4)

rhs<-c(0,1)

hm<-rbind<-(c(1,0,0,0,0),c(0,0,1,1,0))

linear.hypothesis(unrestricted,hm,rhs)

  注意:如果unrestricted是由lm得到的,默认状态下将会进行F检验。如果是由glm得到的,取而代之的将是Kai方检验。检验的类型可以通过type进行修改。

  同样,如果我们想利用异方差或自相关稳健标准误进行检验,我们既可以通过设定white.adjust=TRUE来使用white标准误,也可以利用vcov计算我们自己的协方差矩阵。例如,如果我们想使用上述的Newey-West修正协方差矩阵,我们可以进行如下的设定:

linearHypothesis(unrestricted, hm, rhs,vcov=NeweyWest(unrestricted))

注意:设定white.adjust=TRUE将会通过提高white估计量的精度来修正异方差;如果要使用经典的white估计量,我们可以设定white.adjust="hc0"


3.2 多变量线性模型

例2:多个自变量的一元回归模型

数据集:CPS1998

模型:log(wage)=β1+β2*experience+β3*experience2+β4*education+β5*ethnicity+e

参照模型:log(wage)=β1+β2*experience+β3*experience2+β4*education +e

使用代码:

1)我们还是先来看看数据

data("CPS1988")
summary(CPS1988)

2)  建立模型

cps_lm <- lm(log(wage) ~ experience + I(experience^2)+education + ethnicity, data = CPS1988)

需要说明的是函数I(),它保证I中的表达式进行了规定的代数运算,而不是模型的运算。对于模型中的运算符含义,我们简介如下:(书上表3.2有部分内容)

假定y,x,x0,x1,x2,...是数值变量,X是一个矩阵,A,B,C,...是因子。下面左侧的公式定义了右侧描述的模型。

 模型

说明 

y~x

y~1+x

二者指定的模型是相同的,即y对x的简单线性模型。第一个公式的截距项是隐含的。第二个的截距项是明确给定的。

y~0+x

y~-1+x

y~x-1

y对x过原点的简单线性回归模型(无截距项)

 

y~poly(x,2)                 y~1+x+I(x^2)

yx的二次多项式回归。第一种形式使用正交多项式。

y~X+poly(x,2)

y的多重回归。模型矩阵包含矩阵Xx的二次多项式项

y~A*B

y~A+B+A:B

y~B%in%A

y~A/B

y对A和B的两因素非可加(non-additive)模型。前两个指定了相同的交叉分类(crossed classication),后面的两个指定了相同的嵌套分类(nested classication)。抽象一点儿讲,这四个公式指定了相同的模型子空间。

y~(A+B+C)^2

三因素试验,模型包含主效应和两因素之间的交互作用。两个公式指定的是相同的模型。

y~A*x

y~A/x

y~A/(1+x)-1

yx在A水平单独的简单线性回归模型,几种形式的编码不同。最后一种形式产生与A中水平数一样多的截距和斜率估计值。

   对于不会引起误会的函数运算,我们没必要加I(),但是加上也未尝不可。

3)  虚拟变量与对照组

       在上述回归模型中,我们可以看到回归结果中ethnicity项变为了ethnicityafm,这个改变是说明在回归中我们把cauc作为对照组,afm作为实验组。

       对虚拟变量而言,我们都得注意考虑共线性的问题,所以我们把ethnicity这个虚拟变量中cauc记为0,afm记为1,并且以这两个数据作为回归数据,当然如果反过来,我们仅仅需要把ethnicityafm替换为1-ethnicitycauc即可得到等价的回归方程,在R中,函数contrasts(),告诉你R是如何做这个变量选择的,尝试运行: contrasts(CPS1988$ethnicity),输出为:

     afam

cauc    0

afam    1

   关于R中的虚拟变量选择,在R Development Core Team编写的R语言简介中有更详细的说明,现摘录如下:

      对于模型公式如何指定模型矩阵的列,我们至少还要有些概念。如果我们拥有连续变量,事情就比较简单。每个变量就向模型矩阵提供一列(如果模型中包含截距,它将向模型矩阵提供一列1)。

      但是对于一个k水平的因子A,答案就会因为因子是有序的还是无序的而有差别。对无序因子,对应因子的第2,……,k水平将生成k -1列(因此默认的参数化也就是将各个水平的响应值和初值进行对比)。而对有序因子,k-1则是对1,……,k的正交多项式,忽略常数项。

       尽管这个答案已经挺复杂了,不过还不是全部。首先,如果在一个含有因子项的模型中省略常数项,那么第一个这样的项就会被编码为k列,对应所有的水平。此外,通过更改contrasts的选项(options),可以改变处理的方式。

      在R中默认的设置是options(cOntrasts= c("contr.treatment", "contr.poly"))

      提到这点主要是因为R和S在处理无序因子的时候使用不同的默认设置,S使用Helmert Contrasts。因此,如果你需要将你用R得到的结果与使用S-Plus的论文或教材得到的结果作比较的话,你需要设置options(cOntrasts= c("contr.helmert","contr.poly"))

      这是一个谨慎的差别,因为treatmentcontrast(R的默认值)被认为对新手来说比较容易理解。

      到这里仍然没有结束,因为通过函数contrasts和C还可以对模型中的每一项设定对比的方式。而且我们还没有考虑交互项:由他们的组件引用,生成列的积。

      细节比较复杂,事实上R的模型公式一般都会生成一个统计专家所期望的那个公式,提供这种扩展是为了以防万一。比如拟合一个有交互作用但是没有对应的主效应的模型,一般结果会比较出人意料,这仅仅是为专家准备的。

4)  变量的选择

cps_noeth<- lm(log(wage) ~ experience + I(experience^2) +education, data = CPS1988)
anova(cps_noeth, cps_lm)

      对于任意两个嵌套模型,我们要比较两个模型的差异,可以使用函数anova。在上例中,我们想知道ethnicity对被解释变量wage的关联性,即对于两类人(afm与cauc)是否存在工资的差异。

       我们想更新一个模型,比如说模型某项系数显著为0,可以使用update函数,如我们想去掉ethnicity一项,模型更新为参照模型,使用代码:

cps_noeth <- update(cps_lm, formula = . ~ . -ethnicity)

       上面的“.”表示对原模型变量不作改动,“-”表示去除项“+ “表示加入项。

        AER包中提供wald检验,上面使用anova的例子等价为waldtest(cps_lm, . ~ . - ethnicity)。Wald检验可以处理异方差时的模型比对问题,比anova用法要广一些。

        另外,比较两个模型的回归好坏程度我们还可以使用AIC准则,使用AIC(cps_noeth, cps_lm),得到结果:

                         df      AIC

cps_noeth      5   49965.43

cps_lm           6   49614.68

          这里倒不是说两个模型有无显著差异,而是指综合变量个数与解释程度两者来看,原模型好些罢了。

           我们也可以使用step函数对模型做逐步回归,以期在AIC准则下找到最优模型,运行代码:

step(cps_lm)

得到结果:

Start:  AIC=-30287.75

log(wage) ~ experience + I(experience^2) + education + ethnicity

                                   Df        Sum of Sq         RSS            AIC

                                                       9598.6           -30288

- ethnicity                  1        121.02              9719.6          -29937

- education               1        1546.38           11145.0       -26084

- I(experience^2)      1         1638.14          11236.8        -25853

- experience             1            2642.55        12241.2         -23443

 Call:

lm(formula = log(wage) ~ experience + I(experience^2) +education +

    ethnicity, data =CPS1988)

 Coefficients:

    (Intercept)       experience  I(experience^2)        education       ethnicityafam 

       4.321395         0.077473        -0.001316         0.085673            -0.243364 

也就表明原模型不错,按aic标准而言无需改进,MASS包中stepAIC函数与其输出相同。

3.3 半线性模型

例2续:

模型:log(wage)=β1+g(experience) +β2*education+β3*ethnicity+e

说明:这里g(.)是一个待估函数,由伯恩斯坦定理知,我们总可以用多项式逼近一条曲线,我们通常使用条样回归来解决它。而B样条曲线在计算上较为方便,R中提供函数bs()来处理它,而且bs()结果可以直接用于回归模型,所以拟合理想的模型仅仅需要以下代码:

cps_plm <- lm(log(wage) ~ bs(experience,df = 5) +education + ethnicity, data = CPS1988)

其标准输出为:

Call:

lm(formula = log(wage) ~ bs(experience, df = 5)+education + ethnicity, data = CPS1988)

Residuals:

   Min      1Q      Median      3Q        Max

-2.9315   -0.3079     0.0565     0.3672    3.9945

 

Coefficients:

                                             Estimate   Std.Error   t value    Pr(>|t|)   

(Intercept)                          2.775582   0.056081  49.49   <2e-16 ***

bs(experience, df = 5)1  1.891673  0.075814   24.95   <2e-16 ***

bs(experience, df = 5)2  2.259468  0.046474   48.62   <2e-16 ***

bs(experience, df = 5)3  2.824582  0.070773   39.91   <2e-16 ***

bs(experience, df = 5)4  2.373082  0.065205   36.39   <2e-16 ***

bs(experience, df = 5)5  1.739341  0.119691   14.53   <2e-16 ***

education             0.088181  0.001258   70.07   <2e-16 ***

ethnicityafam         -0.248202   0.012725 -19.50   <2e-16 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’1

Residual standard error: 0.5747 on 28147degrees of freedom

Multiple R-squared: 0.3557,     Adjusted R-squared: 0.3555

F-statistic:  2220 on 7 and 28147 DF,  p-value: <2.2e-16

          书上省略了输出结果,因为作者认为条样回归的系数是不好解释的,仅仅需要注意到在这样的情况下,教育的回报率为8.82%每年。对于使用bs()函数有以下几种方式:

1、  指定分段多项式的阶数(degree),缺省时记为3和手动给出k个顶点(knot)

2、  提供参数df,其余的让机器自动选择

         上面使用的表达式bs(experience,df = 5)表示使用分段三次多项式评估有关的观测experience,隐含5−3 = 2个结点间隔均匀的分布在33.33%和66.67%分位数上。

         df的选择是基于模型的BIC准则,下面的代码考虑了从3到10的取值,建议使用df=5作为最佳渐进曲线的取值:

cps_bs<- lapply(3:10, function(i) lm(log(wage) ~bs(experience, df = i) + education+ ethnicity,data = CPS1988))
structure(sapply(cps_bs,AIC, k = log(nrow(CPS1988))),.Names = 3:10)

       为了更好地理解条样回归与二次函数回归的差别,书利用控制变量的办法给出了图3.4(关注两条线的曲率变化)书图3.4的作图程序如下:

cps <-data.frame(experience = -2:60, education =
with(CPS1988,mean(education[ethnicity == "cauc"])),ethnicity = "cauc")
cps$yhat1<- predict(cps_lm, newdata = cps)
cps$yhat2<- predict(cps_plm, newdata = cps)
plot(log(wage)~ jitter(experience, factor = 1), pch = 19,col = rgb(0.5, 0.5, 0.5, alpha =0.02), data = CPS1988)
lines(yhat1~ experience, data = cps, lty = 2)
lines(yhat2~ experience, data = cps)
legend("topleft",c("quadratic", "spline"), lty = c(2,1),bty = "n")

注:

1、  cps数据中,仅experience项有变化,教育与种族两项数据是一致的

2、  jitter()对数据做一定的抖动,试运行以下代码:

x <-rbinom(1000, 10, 0.25)
y <-rbinom(1000, 10, 0.25)
plot(x,y)#抖动前
plot(jitter(x),jitter(y))#抖动后

3、  rgb()给出了具体的颜色,返回结果的解读可参见如果rgb代码,alpha设定透明度

4、  图3.4表明,两个模型对于20 - 40年的经验范围没有太大的差别。总的来说,experience<8年时的条样回归曲率低些。然而,最明显的特征似乎低于7年的experience的条样回归曲率明显的小。另一个可供选择的方法是使用核的方法,在np包中你可以找到相应的执行函数。



3.4因子、交互作用、加权最小二乘

3.5时间序列的回归

3.6面板数据的回归

3.7线性方程组

(待续)



推荐阅读
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
author-avatar
段筱筱雨_422
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有