首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caret中的逻辑回归--无截获?

Caret中的逻辑回归--无截获?
EN

Stack Overflow用户
提问于 2019-12-31 12:02:13
回答 1查看 509关注 0票数 2

使用插入符号包在R中执行逻辑回归,并尝试强制零截取,以便x=0处的概率为.5。在其他形式的回归中,似乎可以使用tunegrid关闭拦截,但这没有逻辑回归的功能。有什么想法吗?

代码语言:javascript
复制
model <- train(y ~ 0+ x, data = data, method = "glm", family = binomial(link="probit"),
               trControl = train.control)

是的,我“知道”x=0的概率应该是.5,并因此试图强制它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-02 08:24:51

有一个关于如何为插入符号设置自定义模型的vignette。因此,在下面的解决方案中,您还可以看到为什么拦截持续存在:

代码语言:javascript
复制
library(caret)
glm_wo_intercept = getModelInfo("glm",regex=FALSE)[[1]]

如果你看一下拟合,有一行是这样的:

代码语言:javascript
复制
glm_wo_intercept$fit

....
modelArgs <- c(list(formula = as.formula(".outcome ~ ."), data = dat), theDots)
...

因此,默认情况下截取是在那里。您可以更改此行,并在此修改后的模型上运行插入符号:

代码语言:javascript
复制
glm_wo_intercept$fit = function(x, y, wts, param, lev, last, classProbs, ...) {
  dat <- if(is.data.frame(x)) x else as.data.frame(x)
  dat$.outcome <- y
  if(length(levels(y)) > 2) stop("glm models can only use 2-class outcomes")

  theDots <- list(...)
  if(!any(names(theDots) == "family"))
        {
    theDots$family <- if(is.factor(y)) binomial() else gaussian()
                    }
  if(!is.null(wts)) theDots$weights <- wts
  # change the model here
  modelArgs <- c(list(formula = as.formula(".outcome ~ 0+."), data = dat), theDots)

  out <- do.call("glm", modelArgs)
  out$call <- NULL
  out
                  }

我们拟合了这个模型:

代码语言:javascript
复制
data = data.frame(y=factor(runif(100)>0.5),x=rnorm(100))
model <- train(y ~ 0+ x, data = data, method = glm_wo_intercept, 
family = binomial(),trControl = trainControl(method = "cv",number=3))

predict(model,data.frame(x=0),type="prob")
  FALSE TRUE
1   0.5  0.5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59539412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档