我想分析的数据集如下所示
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?
非常感谢任何提示!
答案 0 :(得分:3)
我认为那些是虚拟编码因子变量。
如果您执行以下操作,您可以看到,如果您尝试使用其他所有回归模型建立一个回归模型,那么您就会看到完美契合:
regressormod <- lm(p49 ~ . - win.frac, data = dat)
summary(regressormod)$r.sq
#[1] 1
(数学上)不可能在虚拟编码因子变量中包含所有系数,该回归模型也包括截距(see this answer on Cross Validated)。这就是为什么如果你让它为你做虚拟编码,R默认排除一个因子级别。