2016-12-28 80 views
0

我有一个二进制变量[是/否]和连续变量(X)的数据集。我试图做一个模型来分类[是/否] X.可能通过特定概率强制逻辑回归或其他分类器?

从我的数据集中,当X = 0.5时,48%的观察值为是。但是,当X = 0.5时,我知道Yes的真实概率应该是50%。当我使用逻辑回归X = 0.5!= P [是= 0.5]创建模型时。

我该如何解决这个问题?我想所有的概率都应该稍微低估,如果它没有通过正确的观点。

只需在我的示例中添加一堆观察值以调整比例是否正确?

不一定只是逻辑回归,LDA,QDA等也是有意义的。

我已经搜索堆栈溢出,但只发现有关线性回归的主题。

回答

3

相信在R(假设你使用glm从基R),你只需要

glm(y~I(x-0.5)-1,data=your_data,family=binomial) 

I(x-0.5)在0.5 recenters协变量,在x=0.5-1抑制截距(截距= 0 - >概率= 0.5,在x=0.5)。

例如:

set.seed(101) 
dd <- data.frame(x=runif(100,0.5,1),y=rbinom(100,size=1,prob=0.7)) 
m1 <- glm(y~I(x-0.5)-1,data=dd,family=binomial) 
predict(m1,type="response",newdata=data.frame(x=0.5)) ## 0.5 
+0

我尝试这样高估,但它给了其结果是P [是= 0.5]当X约0.55。此外,X开始时高于P [是],稍后“开启”。我知道P [是]应该总是高于X,除非X = 0.5。 – MLEN

+0

这是否可以这样做,因为X只取0.5和1之间的一个值?将尝试明天和我的代码获取一部分数据。 – MLEN

+0

看起来很奇怪。我看不出'X'的范围会与它有什么关系。 [mcve]肯定会有用。 –

2

的OP写道:

我如何纠正呢?我想所有的概率都应该稍微低估,如果它没有通过正确的观点。

这是不正确的。低估某些价值(如拦截)并高估其他价值是完全可能的。

一个例子以下的情况:

真正的概率:

set.seed(444) 

true_prob <- function(x) { 

    # logit probabilities 
    lp <- (x - 0.5) 

    # true probabilities 
    p <- 1/(1 + exp(-lp)) 
    p 

} 

true_prob(x = 0.5) 
[1] 0.5 

但是,如果您模拟数据和拟合模型,拦截可能被低估和其他价值高估:

n <- 100 
# simulated predictor 
x <- runif(n, 0, 1) 
probs <- true_prob(x) 

# simulated binary response 
y <- as.numeric(runif(n) < probs) 

现在拟合模型并比较真实概率与合适概率:

> true_prob(0.5) 
[1] 0.5 
> predict(m, newdata = data.frame(x = 0.5), type = "response") 
     1 
0.479328 
> true_prob(2) 
[1] 0.8175745 
> predict(m, newdata = data.frame(x = 2), type = "response") 
     1 
0.8665702 

因此,在这个例子中,模型低估了在x = 0.5和x = 2时