考虑到 x 的数据偏斜,显而易见的第一件事就是使用逻辑回归(wiki 链接)。所以我同意这个。我会说x其本身将显示出强烈的意义,但不能解释大部分偏差(相当于 OLS 中的总平方和)。所以有人可能会建议除了x有助于解释力(例如进行分类的人或使用的方法),您的y数据已经 [0,1] 了:你知道它们是代表概率还是发生率?如果是这样,您应该尝试使用未转换的逻辑回归y(在它们是比率/概率之前)。
只有当您的 y 不是概率时,Peter Flom 的观察才有意义。检查plot(density(y));rug(y)
不同的桶x看看你是否看到了变化的 Beta 发行版或只是运行betareg
. 请注意,beta 分布也是指数族分布,因此应该可以glm
在 R 中对其进行建模。
为了让您了解我所说的逻辑回归的含义:
# the 'real' relationship where y is interpreted as the probability of success
y = runif(400)
x = -2*(log(y/(1-y)) - 2) + rnorm(400,sd=2)
glm.logit=glm(y~x,family=binomial); summary(glm.logit)
plot(y ~ x); require(faraway); grid()
points(x,ilogit(coef(glm.logit) %*% rbind(1.0,x)),col="red")
tt=runif(400) # an example of your untransformed regression
newy = ifelse(tt < y, 1, 0)
glm.logit=glm(newy~x,family=binomial); summary(glm.logit)
# if there is not a good match in your tail probabilities try different link function or oversampling with correction (will be worse here, but perhaps not in your data)
glm.probit=glm(y~x,family=binomial(link=probit)); summary(glm.probit)
glm.cloglog=glm(y~x,family=binomial(link=cloglog)); summary(glm.cloglog)
编辑:阅读评论后:
鉴于“y 值是某个类别的概率,是从人们手动完成的平均分类中获得的”,我强烈建议对您的基础数据进行逻辑回归。这是一个例子:
假设您正在查看某人同意提案的概率(y=1同意,y=0不同意)给予激励x介于 0 和 10 之间(可以进行对数转换,例如报酬)。有两个人向候选人提出要约(“吉尔和杰克”)。真正的模型是候选人有一个基本的接受率,并且随着激励的增加而增加。但这也取决于谁提出了这个提议(在这种情况下,我们说吉尔比杰克有更好的机会)。假设他们询问 1000 名候选人并收集他们的接受 (1) 或拒绝 (0) 数据。
require(faraway)
people = c("Jill","Jack")
proposer = sample(people,1000,replace=T)
incentive = runif(1000, min = 0, max =10)
noise = rnorm(1000,sd=2)
# base probability of agreeing is about 12% (ilogit(-2))
agrees = ilogit(-2 + 1*incentive + ifelse(proposer == "Jill", 0 , -0.75) + noise)
tt = runif(1000)
observedAgrees = ifelse(tt < agrees,1,0)
glm.logit=glm(observedAgrees~incentive+proposer,family=binomial); summary(glm.logit)
从摘要中您可以看到该模型非常适合。偏差是χ2n−3(标准χ2是2.df−−−−√)。哪个适合并且它以固定概率击败模型(偏差差异为数百χ22)。考虑到这里有两个协变量,绘制起来有点困难,但你明白了。
xs = coef(glm.logit) %*% rbind(1,incentive,as.factor(proposer))
ys = as.vector(unlist(ilogit(xs)))
plot(ys~ incentive, type="n"); require(faraway); grid()
points(incentive[proposer == "Jill"],ys[proposer == "Jill"],col="red")
points(incentive[proposer == "Jack"],ys[proposer == "Jack"],col="blue")
正如你所看到的,吉尔比杰克更容易获得良好的命中率,但随着激励的增加,这种情况就会消失。
您基本上应该将这种类型的模型应用于您的原始数据。如果您的输出是二进制的,如果是多项式,则保留 1/0,您需要多项式逻辑回归。如果您认为额外的方差来源不是数据收集器,请添加另一个您认为对您的数据有意义的因素(或连续变量)。数据排在第一位、第二位和第三位,然后模型才发挥作用。