当我在df中缺少值时,使用RCompAngrist包的kclass()函数时遇到问题。这是一个函数,应该计算一个“有限信息最大似然”估计器,左边是因变量,右边是两个部分。第一个是内生变量,第二个是仪器。它基于AER包的ivreg()函数。下面是一个最小的工作示例,它将重现错误。
library(magrittr)
library(devtools)
install_github(repo = "RCompAngrist",
username = "MatthieuStigler",
subdir = "RcompAngrist")
library(RcompAngrist)
a <- runif(10, 5, 90)
b <- runif(10, 4, 10)
c <- runif(10, 0, 1)
d <- runif(10, 5, 65)
e <- runif(10, 1, 2)
f <- runif(10, 1, 100)
g <- runif(10, 80, 90)
h <- c(1,12,3,5,NA,16,17,NA,9,10)
dummy <- kclass(a ~ b + c + d | d + e + f + g + h,
model = T,
data=df)
如果您运行此代码,您应该从R:
收到此错误消息cbind(x_exo,z,x_endo,y)出错: 矩阵的行数必须匹配(参见arg 2)
它与数据框中的NA有关,但我无法弄清楚到底出了什么问题。如果在没有NA的情况下创建变量“h”,它就可以工作。但是,如果您通过
省略了NAdf <- data.frame(a,b,c,d,e,f,g,h) %>% na.omit()
在你重新估计模型之前,R给了我这个错误信息:
R_Z中的错误[c(n_G,n_y),c(n_G,n_y)]:下标越界
我也不明白为什么它没有省略NA本身,因为na.action的全局选项是na.omit。 它虽然变得更加怪异。如果从函数中删除“data = df”,然后重新运行模型,则错误消息将切换回
cbind错误[...]
如果代码中有“data = df”,为什么它会有所不同呢?有没有人有任何想法可能存在的想法?我不知道这里出了什么问题。
答案 0 :(得分:0)
看起来你的例子中有几个错误。您必须在data.frame中定义变量才能使data=df
参数起作用。我在下面做了一些调整:
df <- data.frame(
a = runif(10, 5, 90),
b = runif(10, 4, 10),
c = runif(10, 0, 1),
d = runif(10, 5, 65),
e = runif(10, 1, 2),
f = runif(10, 1, 100),
g = runif(10, 80, 90),
h = c(1,12,3,5,NA,16,17,NA,9,10)
)
对RcompAngrist的调用给了我:
m_rca <- RcompAngrist::kclass(a ~ b + c + d | d + e + f + g + h,
data = df)
#>Error in cbind(x_exo, z, x_endo, y) :
#>number of rows of matrices must match (see arg 2)
m_rca <- RcompAngrist::kclass(a ~ b + c + d | d + e + f + g + h,
data = na.omit(df))
#> Error in R_Z[c(n_G, n_y), c(n_G, n_y)]: subscript out of bounds
在第一种情况下,NA
似乎从h
中删除,而不是从其他行中删除,这会导致number of rows must match
错误。第二,我不确定发生了什么。
有几种选择。如果您不需要LIML,最好的方法是使用AER::ivreg,这将为您提供两阶段最小二乘估计。
也欢迎您使用rkclass包(免责声明:我写了它,而Stigler的回购在我做的时候是一个巨大的帮助),这与AER::ivreg
的TSLS结果一致,并提供LIML选项。虽然它处于不稳定的状态,并且没有经过严格测试,所以最好确认结果。
m_aer <- AER::ivreg(a ~ b + c + d | d + e + f + g + h,
data = df)
m_rkc <- rkclass::kclass(a ~ b + c + d | d + e + f + g + h,
model.type = "TSLS",
data = df)
summary(m_aer)
#>
#> Call:
#> AER::ivreg(formula = a ~ b + c + d | d + e + f + g + h, data = df)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -30.296 -16.990 5.157 11.238 28.988
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 64.7730 87.3657 0.741 0.500
#> b 1.3600 9.0175 0.151 0.887
#> c -7.8303 52.9975 -0.148 0.890
#> d -0.5200 0.5537 -0.939 0.401
#>
#> Residual standard error: 27.63 on 4 degrees of freedom
#> Multiple R-Squared: 0.2457, Adjusted R-squared: -0.3201
#> Wald test: 0.43 on 3 and 4 DF, p-value: 0.743
summary(m_rkc)
#> Call:
#> rkclass::kclass(formula = a ~ b + c + d | d + e + f + g + h,
#> data = df, model.type = "TSLS")
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -30.30 -16.99 5.16 11.24 28.99
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 64.773 87.366 0.74 0.50
#> b 1.360 9.018 0.15 0.89
#> c -7.830 52.997 -0.15 0.89
#> d -0.520 0.554 -0.94 0.40
指定了LIML的rkclass::kclass
的结果差别很大,因此使用Stata之类的东西肯定值得检查:
m_liml <- rkclass::kclass(a ~ b + c + d | d + e + f + g + h,
model.type = "LIML",
data = df)
summary(m_liml)
#>Call:
#>rkclass::kclass(formula = a ~ b + c + d | d + e + f + g + h,
#> data = df, model.type = "LIML")
#>
#>Residuals:
#> Min 1Q Median 3Q Max
#>-19.45 -13.84 -1.77 10.82 25.89
#>
#>Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#>(Intercept) 18.784 36.142 0.52 0.63
#>b 10.678 11.677 0.91 0.41
#>c -13.035 52.957 -0.25 0.82
#>d -1.101 0.911 -1.21 0.29