如何在回归模型中指定协变量

时间:2015-06-19 12:02:14

标签: r regression

我想分析的数据集如下所示

n <- 4000
tmp <- t(replicate(n, sample(49,6)))
dat <- matrix(0, nrow=n, ncol=49)
colnames(dat) <- paste("p", 1:49, sep="")
dat <- as.data.frame(dat)
dat[, "win.frac"] <- rnorm(n, mean=0.0176504, sd=0.002)
for (i in 1:nrow(dat)) 
  for (j in 1:6) dat[i, paste("p", tmp[i, j], sep="")] <- 1
str(dat)

现在我想用依赖变量win.frac和所有其他变量(p1,...,p49)作为解释变量进行回归。

然而,在我尝试的所有方法中,我将p49的系数作为NA,并且因为奇点而没有定义消息&#34; 1&#34;。我试过了

modspec <- paste("win.frac ~", paste("p", 1:49, sep="", collapse=" + "))
fit1 <- lm(as.formula(modspec), data=dat)
fit2 <- lm(win.frac ~ ., data=dat)

有趣的是,如果我使用48个解释变量,回归就有效。这可能是(p2,...,p49)或者可能不是(p1,...,p48)包含p49,因此我认为这 与变量p49本身无关。我也尝试了更大的n值,结果相同。

我还尝试了betareg包中的betareg,因为win.frac被限制在0和1之间。此情况下的回归也失败了,错误消息(粗略翻译)& #34; optim(...)中的错误:指定的非限定值&#34;

library(betareg)
fit3 <- betareg(as.formula(modspec), data=dat, link="log")

现在我被卡住了。我该如何进行这种回归?有最大的变量吗?这个问题是由于解释变量是0还是1?

非常感谢任何提示!

1 个答案:

答案 0 :(得分:3)

我认为那些是虚拟编码因子变量。

如果您执行以下操作,您可以看到,如果您尝试使用其他所有回归模型建立一个回归模型,那么您就会看到完美契合:

regressormod <- lm(p49 ~ . - win.frac, data = dat)
summary(regressormod)$r.sq
#[1] 1

(数学上)不可能在虚拟编码因子变量中包含所有系数,该回归模型也包括截距(see this answer on Cross Validated)。这就是为什么如果你让它为你做虚拟编码,R默认排除一个因子级别。