R:带有kclass()函数的cbind()中的错误和数据框中缺少的值

时间:2015-10-04 12:23:36

标签: r nas cbind

当我在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”,它就可以工作。但是,如果您通过

省略了NA
df <- 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”,为什么它会有所不同呢?有没有人有任何想法可能存在的想法?我不知道这里出了什么问题。

1 个答案:

答案 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