每次我们在应用计量经济学课程中面对实际应用时,我们都必须处理分类变量。同样的问题也发生在学生身上:我们怎样才能自动地结合因素水平呢?有简单的R函数吗?
在过去的几年里,我确实上传了一些博客文章。但到目前为止没有什么令人满意的。让我写下几行关于可以做什么的话。如果有人想写一个很好的R函数,那就太棒了。为了说明这一想法,请考虑以下(模拟数据集):
n=200
set.seed(1)
x1=runif(n)
x2=runif(n)
y=1+2*x1-x2+rnorm(n,0,.2)
LB=sample(LETTERS[1:10])
b=data.frame(y=y,x1=x1,
x2=cut(x2,breaks=
c(-1,.05,.1,.2,.35,.4,.55,.65,.8,.9,2),
labels=LB))
str(b)
'data.frame':200 obs. of 3 variables:
$ y : num 1.345 1.863 1.946 2.481 0.765 ...
$ x1: num 0.266 0.372 0.573 0.908 0.202 ...
$ x2: Factor w/ 10 levels "I","A","H","F",..: 4 4 6 4 3 6 7 3 4 8 ...
table(b$x2)[LETTERS[1:10]]
A B C D E F G H I J
11 12 23 34 23 36 12 32 3 14
有一个(连续)因变量y,一个连续协变量x_1和一个范畴变量x_2,具有十个水平。我们可以使用以下方法绘制数据:
plot(b$x1,y,col="white",xlim=c(0,1.1))
text(b$x1,y,as.character(b$x2),cex=.5)
线性回归的输出产生以下预测:
for(i in 1:10){
p=function(x) predict(lm(y~x1+x2,data=b),newdata=data.frame(x1=x,x2=LETTERS[i]))
u=seq(-1,1.065,by=.01)
v=Vectorize(p)(u)
lines(u,v)}
x_1的斜率是相同的,我们只需为每个级别添加一个不同的常数。正如我们所看到的,一些级别非常接近,因此将它们合并成一个类别似乎是合理的。以下是线性回归的输出:
summary(lm(y~x1+x2,data=b))
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.843802 0.119655 7.052 3.23e-11 ***
x1 1.992878 0.053838 37.016 < 2e-16 ***
x2A 0.055500 0.131173 0.423 0.6727
x2H 0.009293 0.121626 0.076 0.9392