研究婚外性行为的问题

摘要

受限因变量(limited dependent variable)是指因变量的观测值是连续的,但是受到某种限制,其抽样并非完全随机的,得到的观测值不能完全反应因变量的真实情况。选择性样本(selective sample)是受限因变量的主要形式,其样本观测值是在选择性限制的情况下抽取的。选择性样本理论与方法发展于20世纪70年代,Heckman做了很多基础性的工作,近几年选择性样本模型已经成为微观统计学的主要研究内容之一,并得到了广泛应用,尤其是在劳动经济学和卫生经济学等领域。受限因变量常见的两类数据:截断(truncation)数据和审查(Censoring)数据。受限因变量模型主要包括截断模型(Truncated Model)和审查模型(Censoring Model)两类。这两类模型多应用在调查数据的分析中。

受限因变量模型主要包括截断模型(Truncated Model)和审查模型(Censoring Model)两类。

截断模型问题的提出:

截断数据即不能从全部个体,而只能从一部分个体中随机抽取因变量的样本观测值。比如,我们对农村居民在过去一年中的家庭医疗支出进行随机调查,在所调查的8000户家庭里,其中有2000户在一年内有发生医疗支出,而剩余的6000户没有医疗支出,如果以2000户的样本进行分析,则显然没有医疗支出的6000户被截断了。

审查模型问题的提出:

在过去一年中,您家里人住院的次数有几次?

A.0次
B.1次
C.2次
D.3次
E.4次
F.5次及以上

该问题中,家里人住院的次数应该是一个计数数据,如果以该变量作为因变量可以使用possion回归,但是此处特殊的地方是当住院次数在5次以上时被归并(censor)在5次,我们观察不到6次或6次以上的值,这就是一种审查数据(censored data)。该如何分析这样的数据?

审查模型—婚外性行为的研究

Fair(1978)研究了婚外性行为的问题。该数据是从大约2000份回收的电子问卷中抽取的601份初婚且未离婚的样本对象。有关初始数据前10个观测值如下。

ffairs表示过去几年中婚外性行为的次数,因变量affairs,取值0、1、2、3、7和12六种取值。其中0为过去几年中没有婚外性行为,1、2、3分别为有1、2和3次婚外性行为;当婚外性行为的次数在4-10之间时,affairs定义为7;当婚外性行为频率较高,为每周,每月或每日时,affairs定义为12;gender表示性别虚拟变量,1为男性,0为女性;age表示年龄;Yearsmarried表示结婚年数;children表示有否孩子,有为1,无为0;religiousness表示宗教信仰,5种程度,从1为反对宗教信仰到5为非常相信宗教;education表示教育年限,有9(初中)、12(高中)、14、16、17、18和20(博士或其他)共7种结果;occupation表示职业,根据Hollingshead职业量表分为1-7种职业。rating表示自我对婚姻的评价,1-5个级别,1为非常不高兴,5为非常幸福。该如何建模分析哪些因素会影响婚外性行为的次数?

数据集

mdata <- read.csv('http://data.galaxystatistics.com/blog_data/regression/affairs_data_transform.csv',header=T)
head(mdata)
##   affairs age yearsmarried religiousness occupation rating
## 1       0  37        10.00             3          7      4
## 2       0  27         4.00             4          6      4
## 3       0  32        15.00             1          1      4
## 4       0  57        15.00             5          6      5
## 5       0  22         0.75             2          6      3
## 6       0  32         1.50             2          5      5
#描述性统计计算
modeldata <- mdata
summary(modeldata)
##     affairs            age         yearsmarried    religiousness  
##  Min.   : 0.000   Min.   :17.50   Min.   : 0.125   Min.   :1.000  
##  1st Qu.: 0.000   1st Qu.:27.00   1st Qu.: 4.000   1st Qu.:2.000  
##  Median : 0.000   Median :32.00   Median : 7.000   Median :3.000  
##  Mean   : 1.456   Mean   :32.49   Mean   : 8.178   Mean   :3.116  
##  3rd Qu.: 0.000   3rd Qu.:37.00   3rd Qu.:15.000   3rd Qu.:4.000  
##  Max.   :12.000   Max.   :57.00   Max.   :15.000   Max.   :5.000  
##    occupation        rating     
##  Min.   :1.000   Min.   :1.000  
##  1st Qu.:3.000   1st Qu.:3.000  
##  Median :5.000   Median :4.000  
##  Mean   :4.195   Mean   :3.932  
##  3rd Qu.:6.000   3rd Qu.:5.000  
##  Max.   :7.000   Max.   :5.000
#数据集字段名称转换
renames <- function(x) {
  ocol <- ncol(x)
  if (ocol==2) {
    xnam <- paste0("X")
    names(x) <- c('Y', xnam)
  }else if(ocol>2) {
    xnam <- paste0("X", 1:(ocol-1))
    names(x) <- c('Y', xnam)
  }
  return(x)
}
modeldata <- renames(modeldata)
head(modeldata)
##   Y X1    X2 X3 X4 X5
## 1 0 37 10.00  3  7  4
## 2 0 27  4.00  4  6  4
## 3 0 32 15.00  1  1  4
## 4 0 57 15.00  5  6  5
## 5 0 22  0.75  2  6  3
## 6 0 32  1.50  2  5  5
class(modeldata)
## [1] "data.frame"
dim(modeldata)
## [1] 601   6
regFormula <- as.formula(paste("Y ~ ", paste(names(modeldata)[-1], collapse= "+")))
regFormula
## Y ~ X1 + X2 + X3 + X4 + X5

因变量Y的描述统计

取值 计数 百分比 累计数 累计百分比
0 451 75.04 451 75.04
1 34 5.66 485 80.70
2 17 2.83 502 83.53
3 19 3.16 521 86.69
7 42 6.99 563 93.68
12 38 6.32 601 100.00
Total 601 100.00 601 100.00

从上表中可以看到,Y中取值为0的样本有451个,占了总样本的75%,而Y大于0的样本只有25%左右。因此,如果用传统的OLS法直接对线性回归模型进行估计,则很难确拟合Y的值。

模型方法

Tobit模型

#####拟合估算:方式方法1#####
###建立Tobit模型可以使用censReg包里的censReg(),使用方法和结果如下。
#install.packages('censReg')
library(censReg)
Tobit.fit <- censReg(regFormula, data=modeldata)
#展示拟合模型的详细结果
summary(Tobit.fit)
## 
## Call:
## censReg(formula = regFormula, data = modeldata)
## 
## Observations:
##          Total  Left-censored     Uncensored Right-censored 
##            601            451            150              0 
## 
## Coefficients:
##             Estimate Std. error t value  Pr(> t)    
## (Intercept)  8.17420    2.74145   2.982  0.00287 ** 
## X1          -0.17933    0.07909  -2.267  0.02337 *  
## X2           0.55414    0.13452   4.119 3.80e-05 ***
## X3          -1.68622    0.40375  -4.176 2.96e-05 ***
## X4           0.32605    0.25442   1.282  0.20001    
## X5          -2.28497    0.40783  -5.603 2.11e-08 ***
## logSigma     2.10986    0.06710  31.444  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Newton-Raphson maximisation, 7 iterations
## Return code 1: gradient close to zero
## Log-likelihood: -705.5762 on 7 Df
#列出拟合模型的模型参数
coefficients(Tobit.fit)
## (Intercept)          X1          X2          X3          X4          X5 
##   8.1741974  -0.1793326   0.5541418  -1.6862205   0.3260532  -2.2849727 
##    logSigma 
##   2.1098592
# predict(Tobit.fit, modeldata[-1])

#####拟合估算:方式方法2#####
###Tobit模型也可以用AER包里的tobit()函数,使用方法和结果如下。
#install.packages('AER')
library(AER)
Tobit.fit2 <- tobit(regFormula, data=modeldata)
#展示拟合模型的详细结果
summary(Tobit.fit2)
## 
## Call:
## tobit(formula = Y ~ X1 + X2 + X3 + X4 + X5, data = modeldata)
## 
## Observations:
##          Total  Left-censored     Uncensored Right-censored 
##            601            451            150              0 
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  8.17420    2.74145   2.982  0.00287 ** 
## X1          -0.17933    0.07909  -2.267  0.02337 *  
## X2           0.55414    0.13452   4.119 3.80e-05 ***
## X3          -1.68622    0.40375  -4.176 2.96e-05 ***
## X4           0.32605    0.25442   1.282  0.20001    
## X5          -2.28497    0.40783  -5.603 2.11e-08 ***
## Log(scale)   2.10986    0.06710  31.444  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Scale: 8.247 
## 
## Gaussian distribution
## Number of Newton-Raphson Iterations: 4 
## Log-likelihood: -705.6 on 7 Df
## Wald-statistic: 67.71 on 5 Df, p-value: 3.0718e-13
#列出拟合模型的模型参数
coefficients(Tobit.fit2) 
## (Intercept)          X1          X2          X3          X4          X5 
##   8.1741974  -0.1793326   0.5541418  -1.6862205   0.3260532  -2.2849727
#predict(Tobit.fit2, modeldata[-1])