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

How to specify covariates in a regression model

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

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,并显示消息“1 由于奇点而未定义”。我试过了

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 之间。这种情况下的回归也失败了,并显示错误消息(粗略翻译) "error in optim(...): non-finite value of optim specified"

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

现在我卡住了。我如何执行此回归?有最大变量吗?这个问题是因为解释变量不是0就是1吗?

非常感谢任何提示!

我假设那些是虚拟编码因子变量。

如果您执行以下操作,您会发现如果您尝试将其中一个回归变量与所有其他回归变量一起建模,您将获得完美契合:

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

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