predict.glm()测试数据中有三个新类别(r)(错误)
我有一个名为predict.glm()测试数据中有三个新类别(r)(错误),r,glm,lm,predict,categorical-data,R,Glm,Lm,Predict,Categorical Data,我有一个名为data的数据集,它有481092行 我将数据分成两等份: 第一个减半(第1行:240 546)称为train,用于glm() 第二个减半(第240 547行:481 092)称为test,用于验证模型 然后我开始回归: testreg <- glm(train$returnShipment ~ train$size + train$color + train$price + train$manufacturerID + train$saluta
data
的数据集,它有481092行
我将数据
分成两等份:
train
,用于glm()
李>
test
,用于验证模型李>
然后我开始回归:
testreg <- glm(train$returnShipment ~ train$size + train$color + train$price +
train$manufacturerID + train$salutation + train$state +
train$age + train$deliverytime,
family=binomial(link="logit"), data=train)
现在我知道这些水平在回归中被省略了,因为它没有显示这些水平的任何系数
我试过这个:。但不知怎么的,它对我不起作用,或者我不知道如何实现它。我想预测相依二元变量,但当然只能用现有的系数。上面的链接建议告诉R,具有新级别的行应该被称为/或视为NA
我怎样才能继续
编辑Z.Li建议的方法
我在第一步遇到了问题:
xlevels <- testreg$xlevels$manufacturerID
mID125 <- xlevels[1]
xlevels由于您根据行数划分了train
和test
样本,因此,变量的某些因子水平在train和test样本中的表示并不相同
您需要进行分层抽样,以确保训练样本和测试样本都具有所有因子级别的表示。使用splitstackshape
包中的分层
在固定效应建模中,包括线性模型和广义线性模型,不可能获得新因子水平的估计glm
(以及lm
)记录了在模型拟合期间显示和使用的因子水平,可在testreg$xlevels
中找到
模型估算的模型公式为:
returnShipment ~ size + color + price + manufacturerID + salutation +
state + age + deliverytime
然后predict
投诉manufactureID
的新因子水平125、136、137。这意味着,这些级别不在testreg$xlevels$manufactureID
内,因此没有用于预测的相关系数。在这种情况下,我们必须删除此因子变量并使用预测公式:
returnShipment ~ size + color + price + salutation +
state + age + deliverytime
但是,标准的predict
例程不能接受您自定义的预测公式。通常有两种解决方案:
从testreg
中提取模型矩阵和模型系数,并通过矩阵向量乘法手动预测所需的模型项。这就是你在帖子中给出的建议李>
将test
中的系数级别重置为testreg$xlevels$manufactureID
中出现的任何一个级别,例如,testreg$xlevels$manufactureID[1]
。因此,我们仍然可以使用标准predict
进行预测
现在,让我们首先选择一个用于模型拟合的因子级别
xlevels <- testreg$xlevels$manufacturerID
mID125 <- xlevels[1]
更新:
您抱怨在尝试上述解决方案时遇到了各种麻烦。这就是原因
您的代码:
testreg <- glm(train$returnShipment~ train$size + train$color +
train$price + train$manufacturerID + train$salutation +
train$state + train$age + train$deliverytime,
family=binomial(link="logit"), data=train)
现在,我们看到所有东西都带有前缀foo$
。预测期间:
newdata <- foo[1:2, ] ## take first 2 rows of "foo" as "newdata"
rm(foo) ## remove "foo" from R session
predict(toy, newdata)
然后,foo$
消失了
> toy$formula
y ~ a
> toy$xlevels
$a
[1] "a" "b" "c" "d"
这可以解释两件事:
您在评论中向我抱怨,当您执行testreg$xlevels$manufactureID
时,会得到NULL
李>
您发布的预测错误
Error in model.frame.default(Terms, newdata, na.action=na.action, xlev=object$xlevels):
Factor 'train$manufacturerID' has new levels 125, 136, 137
投诉train$manufacturerID
而不是test$manufacturerID
非常感谢。但我不想删除一个整因子变量,只想删除水平125、136和137(manufacturerID)。我可以这样使用你的第一行代码吗:mID125好的,也许我误解了你或者单词factor变量。所以变量manufacturerID的级别125、136和137没有在glm()中使用,而是存在于测试数据部分(您称之为newdata)。很抱歉,我不能完全理解它。这就是它不起作用的原因。我将编辑我的问题,让你知道我做了什么好吗?好的,我写了我到目前为止所做的。也许你可以用正确的代码和更多的解释来编辑问题中的“编辑”部分。请尽可能简单:D R对我来说是新事物,英语不是我的第一语言:D@Zheyuan_Li当然可以。我会把它贴在下面的答案编辑
est <- coef(testreg)[paste0(manufacturerID, mID125)]
pred <- pred - est
testreg$family$linkinv(pred)
testreg <- glm(train$returnShipment~ train$size + train$color +
train$price + train$manufacturerID + train$salutation +
train$state + train$age + train$deliverytime,
family=binomial(link="logit"), data=train)
set.seed(0); y <- rnorm(50, 0, 1)
set.seed(0); a <- sample(letters[1:4], 50, replace = TRUE)
foo <- data.frame(y = y, a = factor(a))
toy <- glm(foo$y ~ foo$a, data = foo) ## bad style
> toy$formula
foo$y ~ foo$a
> toy$xlevels
$`foo$a`
[1] "a" "b" "c" "d"
newdata <- foo[1:2, ] ## take first 2 rows of "foo" as "newdata"
rm(foo) ## remove "foo" from R session
predict(toy, newdata)
foo <- data.frame(y = y, a = factor(a))
toy <- glm(y ~ a, data = foo)
> toy$formula
y ~ a
> toy$xlevels
$a
[1] "a" "b" "c" "d"
Error in model.frame.default(Terms, newdata, na.action=na.action, xlev=object$xlevels):
Factor 'train$manufacturerID' has new levels 125, 136, 137