偏移和分类变量

时间:2013-07-02 10:53:23

标签: r regression linear-regression categorical-data

使用此数据集:

http://pastebin.com/4wiFrsNg

并建立在这个问题上:

How to fit predefined offsets to models containing categorical variables in R

为了测试模型在另一个测试数据集上的有效性,我想从下面得到拟合模型:

ModelA<-lm(Response1~Categorical)

并使其符合关系B:

Response2~Categorical

每种情况下的响应变量都相同。

以上链接提供了如何为分类变量的级别拟合偏移量的解决方案,对于我的数据将涉及:

# compute the offsets for each level of Categorical from the following model:

m<-lm(Response1~Categorical,data=dat)
summary(m)

#Create vector of offsets for variable

o <- with(dat, ifelse(Categorical == "Y", 0.25773, -0.25773))

#run second model with offsets from first model

m1<-lm(dat$Response2 ~ 1 + offset(o))

然而,当我检查这是否有效时,通过为关系指定这些已知的偏移量,然后使用相同的模型检查它而不指定偏移量,因此:

# run model using Response1 to get values for slope offsets


m<-lm(Response1 ~ Categorical,data=dat)
summary(m)


# Specify offsets from this in the model of the same data (i.e. still using Response1)

o <- with(dat, ifelse(Categorical == "Y", 0.25773, -0.25773))
m1<-lm(dat$Response1 ~ 1 + offset(o))


#check the residuals from m and m2 are identical

m$residuals
m2$residuals

残差不同,表明该方法不起作用。

我很想知道:

1)有没有人有任何其他想法想法如何指定分类变量的水平偏移?  2)除了级别的偏移之外,您能否就如何为这种变量的截距项指定和偏移提供建议?

后者对于连续变量来说足够简单,因为只有一个截距:

 # run model using Response1 to get values for intercept and slope offsets 

m<-lm(Response1~log(Continuous),data=dat)
summary(m)
# Specify offsets for the intercept and slope for the model involving the second response variable
 m <- lm(Response2 ~ 0+offset(rep(0.22483, nrow(dat))) + offset( -0.07115*log(Continuous)))

但我不清楚这会如何转移到分类变量。

非常感谢。

1 个答案:

答案 0 :(得分:1)

R估计治疗对比。你显然来自一个你被教导期望c(1,-1)对比但却没有学会去看编码的世界。

m<-lm(Response1 ~ Categorical,data=dat)
summary(m)

o <- with(dat, ifelse(Categorical == "Y", 0.25773, 0))
m1<-lm(dat$Response1 ~ 1 + offset(o))

abs( m$residuals - m1$residuals) < 0.00001
   1    2    3    4    5    6    7    8    9   10   11   12   13   14 
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
  15   16   17   18   19   20   21   22   23   24   25   26   27   28 
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
  29   30   31   32   33   34   35   36   37   38   39   40   41   42 
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
  43   44 
TRUE TRUE 

与您的方法相反:

 o <- with(dat, ifelse(Categorical == "Y", 0.25773, -0.25773))

这给了所有的假。看看:

 ?model.matrix