R:在线性组合中添加常量,glht()

时间:2017-09-02 20:55:25

标签: r matrix hypothesis-test

所以我试图复制我在希望,格里菲斯和林的计量经济学原理中看到的stata函数。我要复制的函数在stata中看起来像这样;

lincom _cons + b_1 * [arbitrary value] - c

这是零假设H0:B0 + B1 * X = C

我能够在没有常量的情况下测试假设,但我想在测试参数的线性组合时添加常量。我浏览了glht()的包文档,但它只有一个例子,他们取出了常量。我复制了这个例子,保持常数,但是当你有一个矩阵K和一个常数时,我不确定如何测试线性组合。作为参考,这是他们的例子;

### multiple linear model, swiss data
lmod <- lm(Fertility ~ ., data = swiss)

### test of H_0: all regression coefficients are zero 
### (ignore intercept)

### define coefficients of linear function directly
K <- diag(length(coef(lmod)))[-1,]
rownames(K) <- names(coef(lmod))[-1]
K

### set up general linear hypothesis
glht(lmod, linfct = K)

我不擅长创建假装数据集,但这是我的尝试。

library(multcomp)
test.data = data.frame(test.y = seq(200,20000,1000),
                   test.x = seq(10,1000,10))
test.data$test.y = sort(test.data$test.y + rnorm(100, mean = 10000, sd = 100)) - 
  rnorm(100, mean = 5733, sd = 77)
test.lm = lm(test.y ~ test.x, data = test.data)

# to view the name of the coefficients
coef(test.lm)

# this produces an error. How can I add this intercept?
glht(test.lm, 
 linfct = c("(Intercept) + test.x = 20"))

根据文档,似乎有两种方法可以解决这个问题。我可以使用函数diag()来构造一个矩阵,然后我可以在linfct =参数中使用它,或者我可以使用一个字符串。这个方法的问题是,我不太清楚如何使用diag()方法,同时还包括常量(方程的右边);在字符串方法的情况下,我不知道如何添加截距。

非常感谢任何和所有帮助。

以下是我正在使用的数据。这最初是在.dta文件中,所以我为可怕的格式化道歉。根据我上面提到的那本书,这是food.dta文件。

structure(list(food_exp = structure(c(115.22, 135.98, 119.34, 
114.96, 187.05, 243.92, 267.43, 238.71, 295.94, 317.78, 216, 
240.35, 386.57, 261.53, 249.34, 309.87, 345.89, 165.54, 196.98, 
395.26, 406.34, 171.92, 303.23, 377.04, 194.35, 213.48, 293.87, 
259.61, 323.71, 275.02, 109.71, 359.19, 201.51, 460.36, 447.76, 
482.55, 438.29, 587.66, 257.95, 375.73), label = "household food expenditure per week", format.stata = "%10.0g"), 
income = structure(c(3.69, 4.39, 4.75, 6.03, 12.47, 12.98, 
14.2, 14.76, 15.32, 16.39, 17.35, 17.77, 17.93, 18.43, 18.55, 
18.8, 18.81, 19.04, 19.22, 19.93, 20.13, 20.33, 20.37, 20.43, 
21.45, 22.52, 22.55, 22.86, 24.2, 24.39, 24.42, 25.2, 25.5, 
26.61, 26.7, 27.14, 27.16, 28.62, 29.4, 33.4), label = "weekly  household income", format.stata = "%10.0g")), .Names = c("food_exp","income"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -40L))

1 个答案:

答案 0 :(得分:1)

让我们从您的图书中加载数据,然后检查我们的结果,以确保我们能够获得相同的结果。我通过这种方式向你提出答案,部分原因是它帮助我准确理解你的想法,并在一定程度上让你相信这里的等同性。

对我来说,部分困惑在于lincom示例的语法。你的语法可能是正确的,我不知道,但根据它看起来我认为你做了不同的事情,因此你的书真的有帮助。

首先,让我们加载数据并运行第115页上的线性模型:

install.packages("devtools")  # if not already installed
library(devtools)
install_git("https://github.com/ccolonescu/PoEdata")

library(PoEdata)   # loads the package in memory
library(multcomp)  # for hypo testing
data(food)         # loads the data set of interest

# EDA
summary(food)

# Model
mod <- lm(food_exp ~ income, data = food)
summary(mod) # Note: same results as PoE 4th ed. Pg 115 (other than rounding)
Call:
lm(formula = food_exp ~ income, data = food)

Residuals:
     Min       1Q   Median       3Q      Max 
-223.025  -50.816   -6.324   67.879  212.044 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   83.416     43.410   1.922   0.0622 .  
income        10.210      2.093   4.877 1.95e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 89.52 on 38 degrees of freedom
Multiple R-squared:  0.385,   Adjusted R-squared:  0.3688 
F-statistic: 23.79 on 1 and 38 DF,  p-value: 1.946e-05

到目前为止,这么好。在Pg。第4版中的115显示了除了一些小的舍入差异之外的相同回归模型。

接下来,该书计算每周食品支出的点估计,条件是家庭收入为20(2000美元/周):

# Point estimate
predict(mod, newdata = data.frame(income=20)) 
       1 
287.6089

同样,我们得到完全相同的结果。顺便提一下,您还可以在Wiley出版的书籍 Using Stata for Principles of Econometrics 4th ed. 的免费样本中看到相同的结果。

最后,我们已准备好进行假设检验。如上所述,我想确保我能够完全复制Stata的内容。你提供了你的代码,但我对你的语法有点困惑。

幸运的是,我们很幸运。虽然第4版Stata指南的预览仅通过第2章,但荷兰某大学的Economics and Business faculty能够使旧版本的部分版本免费提供DRM,因此我们可以参考:

lincom

最后看到我们可以像这样在R中复制它:

# Hyothesis Test 
summary(glht(mod,  linfct = c("income = 15")))
   Simultaneous Tests for General Linear Hypotheses

Fit: lm(formula = food_exp ~ income, data = food)

Linear Hypotheses:
             Estimate Std. Error t value Pr(>|t|)  
income == 15   10.210      2.093  -2.288   0.0278 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)
不要被不同的输出格式所欺骗。它在R代码中显示的estimate只是回归模型income上的系数(&#34; b2&#34;)。它不会根据假设检验而改变,而在Stata输出中它们会做&#34; b2 - 15&#34; (在R中是mod$coefficients[2]-15)。

t(t value)和p(Pr(>|t|))值的变化是什么。请注意,R中的这些测试统计信息与Stata中的测试统计信息相匹配。

另一个例子是H0收入= 7.5让我们看到R值和Stata中的t值为1.29且p值为.203:

enter image description here

summary(glht(mod,  linfct = c("income = 7.5")))
   Simultaneous Tests for General Linear Hypotheses

Fit: lm(formula = food_exp ~ income, data = food)

Linear Hypotheses:
              Estimate Std. Error t value Pr(>|t|)
income == 7.5   10.210      2.093   1.294    0.203
(Adjusted p values reported -- single-step method)

您还可以使用confint()获得置信区间。

最后,我认为你正在查看你的书的第3.6.4节(第117页),其中一位高管想要检验这样的假设:给income 20($ 2000 /周){{1} }是&gt; 250:

enter image description here

我们可以将R中的t值计算为:

food_exp

其中公式与本书前2页的公式相同。

我们甚至可以将它变成自定义函数(适用于简单线性回归,仅表示1个自变量):

t = sum((mod$coefficients[1] + 20*mod$coefficients[2]-250)/sqrt(vcov(mod)[1] + 20^2 * vcov(mod)[4] + 2 * 20 *  vcov(mod)[2]))
t
[1] 2.652613