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行

我将
数据
分成两等份:

  • 第一个减半(第1行:240 546)称为
    train
    ,用于
    glm()
  • 第二个减半(第240 547行:481 092)称为
    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