|
我也遇到这个问题,花了一些时间解决了。与各位分享。
二楼把censReg函数的help文档发出来有什么用,还一堆人感谢,根本不解决问题。
censReg函数有很大的缺陷,不能用向量设置截取上下限,只支持标量设置。这个例子的截取项是log(follow),对每个样本都不一样,所以不能使用censReg函数,要使用AER包中的tobit函数。
但是这里有两个小坑,不仔细的同学会得不到正确的结果。
因为有几个样本的durat是1,取对数后就是0,tobit函数默认的下限就是0,如果不特别设置的话,这几个样本点会被当做下限点处理,
但是这个例子只有上限,没有下限,所以要把下限设定为任意负数。
因变量已经给出了ldurat,有的同学会直接使用这个因变量。但是数据中的ldurat只保留了7位小数,而例子中的截取上限log(follow)是需要我们自行计算的,由于原始数据的精度问题,会导致部分上限样本没有按照上限点处理。
我们把ldurat自行计算,覆盖掉原始数据,或者也可以在设置截取上限的时候,减去一个很微小的量。就可以得到正确的结果。
代码如下:把数据载入,attach一下。
ldurat <- log(durat) #原始数据精度不够,会出错,覆盖掉。
expr <- ldurat ~ workprg + priors + tserved + felon + alcohol + drugs + black + married + educ + age
library(AER)
m1 <- tobit(expr, left = -Inf, right = log(follow))
summary(m1)
就可以看到和书上一样的结果了。
|