估计百分比作为回归中的因变量


13

我将38项考试中学生的排名百分比作为我研究中的因变量。排名百分比由(学生的等级/考试中的学生人数)计算得出。这个因变量具有几乎均匀的分布,我想估计一些变量对因变量的影响。

我使用哪种回归方法?


2
常规(OLS)回归不对因变量的分布进行假设,而对模型的误差(由残差估计)的分布进行假设。如果每次考试的学生人数有所不同,则可以从OLS回归开始并检查假设。
彼得·弗洛姆

2
@Peter,这是一个很好的建议,但我担心会出现一些微妙而又重要的违反OLS假设的情况。一个学生在考试中的排名将取决于参加该考试的所有其他学生的属性。OLS的任何(常规)应用程序都无法捕获这种相互依赖性。
ub

理解这里发生的事情的另一种方法是考虑这个问题的最简单实例,其中每个“考试”都恰好涉及到两个学生。因变量表明哪个学生表现更好。如果我们将每次考试都视为比赛,那相当于举行一场比赛。实际上,问题是要根据一些解释变量,为每个参与者的“实力”提出一个公式。
ub

您说对了@whuber。如何解决呢?我认为IRT模型可以做到,但是自从我研究这些以来已经很长时间了。
彼得·弗洛姆

@whuber我认为可以使用IRT,例如有序的Probit(或Logit)。但是也可以将百分比等级视为有界连续变量(如Mike建议的逻辑回归),这将是一个有效的近似值,而有序概率将是该问题的直接模型。后勤的优势是简约。为了考虑学生的相关性,可以实施怀特或三明治方差估计器。我了解该样本有38个针对多个学生的考试(纵向),因此应该可行。
JDav

Answers:


3

如果您正在使用Stata,请查看以下示例:http : //www.ats.ucla.edu/stat/stata/faq/proportion.htm

这是此网页的引文:

“当因变量为比例时,如何回归?

比例数据的值介于零到一之间。自然地,使预测值也落在零和一之间会很好。实现此目的的一种方法是使用具有logit链接和二项式族的广义线性模型(glm)。我们将在glm模型中包含鲁棒的选项,以获取鲁棒的标准误差,如果我们未正确指定分发系列,该方法将特别有用。


2
很好,在其他情况下也是个不错的建议,但是使用glm并不能解决我的答案中发现的问题。
ub


9

概要

如果仔细解释,回归结果可能会有一些局限性。不可避免的变化形式将导致系数估计值大幅缩小至零。需要一个更好的模型,以更合适的方式处理变化。

(可以构造一个最大似然模型,但由于需要进行计算,因此可能不可行,该计算涉及对多维积分的数值评估。维度的数量等于在该课程中注册的学生的数量。)

介绍

为了说明我们的直觉,请想象一下,这38项考试是在一所小学校的一个学期中有38个单独的课程进行的,招收了200名大学生。在现实情况下,这些学生将具有不同的能力和经验。作为对这些能力和经验的替代衡量,我们可能会在SAT数学和语言测试以及大学一年级(1-4年)中取得分数。

通常,学生将根据自己的能力和兴趣参加课程。新生参加入门课程,入门课程主要由新生组成。高年级生,才华横溢的新生和大二学生都可以参加高级和研究生课程。 这种选择对学生进行了部分分层,因此任何班级学生的先天能力通常比整个学校的能力分布更加同质。

因此,能力最强的学生可能会发现自己在所报读的困难,高级课程的最低分数附近得分,而能力最差的学生可能会在其所参加的简单入门课程的最高分数附近得分。这可能会使直接将考试等级与学生和班级的属性直接联系起来的尝试混淆。

分析

索引学生,并通过向量x i给出学生i的属性。用j索引类,并通过向量z j给出类j的属性。参加j班的学生人数为A jiixijjzjjAj

假设“实力”的每个学生是他们的属性的功能,再加上一些随机值,这也可以具有零均值:si

si=f(xi,β)+εi.

我们通过将独立的随机值添加到该课程中注册的每个学生的实力并将其转换为等级来对类中的考试进行建模。如果学生参加了课程,则他们的相对排名由他们在值的排序数组中的位置确定Ĵ [R Ĵjijri,j

(sk+δk,j,kAj).

这个位置被除以总班级人数再除以一,就可以得出因变量,即百分比等级:ri,j

pi,j=ri,j1+|Aj|.

εiδi,j

模拟

无需过多的努力,我们就可以模拟这种情况来创建和分析一些样本数据。模拟的一个优点是它可以融合学生的真实优势,而这在现实中是无法观察到的。另一个是我们可以改变未观察值的典型大小以及类分配。这为评估提议的分析方法(例如回归)提供了一个“沙盒”。

首先,让我们将随机数生成器设置为可重现的结果,并指定问题的大小。我使用R是因为任何人都可以使用。

set.seed(17)
n.pop <- 200      # Number of students
n.classes <- 38   # Number of classes
courseload <- 4.5 # Expected number of classes per student

n.classesδi,jj

classes <- data.frame(cbind(
  math <- runif(n.classes), 
  rbeta(n.classes, shape1=(verbal <- (1-math)*5), shape2=5-verbal),
  runif(n.classes, min=0, max=7),
  rgamma(n.classes, 10, 10)))
rm(math, verbal)
colnames(classes) <- c("math.dif", "verbal.dif", "level", "ease")
classes <- classes[order(classes$math.dif + classes$verbal.dif + classes$level), ]
row.names(classes) <- 1:n.classes
plot(classes, main="Classes")

这些学生分布在这四年中,并且具有随机的属性值。这些属性之间没有任何关联:

students <- data.frame(cbind(
  as.factor(ceiling(runif(n.pop, max=4))),
  sapply(rnorm(n.pop, mean=60, sd=10), function(x) 10*median(c(20, 80, floor(x)))),
  sapply(rnorm(n.pop, mean=55, sd=10), function(x) 10*median(c(00, 80, floor(x)))),
  rnorm(n.pop)
  ))
colnames(students) <- c("year", "math", "verbal", "ability")
plot(students, main="Students")

εibetabeta

beta <- list(year.1=0, year.2=1, year.3=3, year.4=4, math=1/100, verbal=1/100, ability=2, sigma=0.01)
students$strength <- (students$year==1)*beta$year.1 + 
  (students$year==2)*beta$year.2 +
  (students$year==3)*beta$year.3 +
  (students$year==4)*beta$year.4 +
  students$math*beta$math + 
  students$verbal*beta$verbal + 
  students$ability*beta$ability
students <- students[order(students$strength), ]
row.names(students) <- 1:n.pop

students$abilitybeta$abilitybeta$sigmaeaseδi,j.01.2

classesspreadassignments <-...0

pick.classes <- function(i, k, spread) {
  # i is student strength rank
  # k is number to pick
  p <- pmin(0.05, diff(pbeta(0:n.classes/n.classes, i/spread, (1+n.pop-i)/spread)))
  sample(1:n.classes, k, prob=p)
}
students$n.classes <- floor(1/2 + 2 * rbeta(n.pop,10,10) * courseload)
assignments <- lapply(1:n.pop, function(i) pick.classes(i, students$n.classes[i], spread=1))
enrolment <- function(k) length(seq(1, n.pop)[sapply(assignments, function(x) !is.na(match(k, x)))])
classes$size <- sapply(1:n.classes, enrolment)
classes$variation <- by(data, data$Class, function(x) diff(range(x$strength)))

(有关此步骤完成情况的示例,请参见下图。)

n1/(n+1)n/(n+1)1/(n+1)01

exam.do <- function(k) {
  s <- seq(1, n.pop)[sapply(assignments, function(x) !is.na(match(k, x)))]
  e <- classes$ease[k]
  rv <- cbind(rep(k, length(s)), s, order(rnorm(length(s), students$strength[s], sd=e*beta$sigma*classes$variation[k])))
  rv <- cbind(rv, rv[,3] / (length(s)+1))
  dimnames(rv) <- list(NULL, c("Class", "Student", "Rank", "Prank"))
  rv
}
data.raw <- do.call(rbind, sapply(1:n.classes, exam.do))

对于这些原始数据,我们附加了student和class属性,以创建适合分析的数据集:

data <- merge(data.raw, classes, by.x="Class", by.y="row.names")
data <- merge(data, students, by.x="Student", by.y="row.names")

让我们通过检查数据的随机样本来定位自己:

> data[sort(sample(1:dim(data)[1], 5)),]

Row Student Class Rank Prank math.dif verbal.dif  level  ease Size year math verbal ability strength n.classes
118      28     1   22 0.957  0.77997   6.95e-02 0.0523 1.032   22    2  590    380   0.576     16.9         4
248      55     5   24 0.889  0.96838   1.32e-07 0.5217 0.956   26    3  460    520  -2.163     19.0         5
278      62     6   22 0.917  0.15505   9.54e-01 0.4112 0.497   23    2  640    510  -0.673     19.7         4
400      89    10   16 0.800  0.00227   1.00e+00 1.3880 0.579   19    1  800    350   0.598     21.6         5
806     182    35   18 0.692  0.88116   5.44e-02 6.1747 0.800   25    4  610    580   0.776     30.7         4

例如,记录118指出,#28学生进入了#1类,并且在考试中得分排名第22(从下至下),得分排名为0.957。这门课的整体难度为0.0523(非常容易)。共有22名学生入学。该学生是二年级(二年级),数学590分,SAT口语成绩380分。他们的整体固有学术实力为16.9。他们当时参加了四个班级。

该数据集与问题中的描述相符。例如,百分比等级的确几乎是统一的(因为任何完整的数据集都必须如此,因为单个类的百分比等级具有离散的均匀分布)。

请记住,由于中的系数beta,该模型假设考试成绩与该数据集中显示的变量之间存在很强的联系。但是回归显示了什么? 让我们针对可能与他们的能力有关的所有可观察到的学生特征以及班级难度指标回归百分等级的逻辑:

logistic <- function(p) log(p / (1-p))
fit <- lm(logistic(Prank) ~ as.factor(year) + math + verbal + level, data=data)
summary(fit)

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -2.577788   0.421579   -6.11  1.5e-09 ***
as.factor(year)2  0.467846   0.150670    3.11   0.0020 ** 
as.factor(year)3  0.984671   0.164614    5.98  3.2e-09 ***
as.factor(year)4  1.109897   0.171704    6.46  1.7e-10 ***
math              0.002599   0.000538    4.83  1.6e-06 ***
verbal            0.002130   0.000514    4.14  3.8e-05 ***
level            -0.208495   0.036365   -5.73  1.4e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 1.48 on 883 degrees of freedom
Multiple R-squared: 0.0661, Adjusted R-squared: 0.0598 
F-statistic: 10.4 on 6 and 883 DF,  p-value: 3.51e-11 

诊断图(plot(fit))看起来是快速的:残差是等方差的,并且是正常的(尽管尾巴略短,这没问题);没有异常值;并且在任何观察中都没有不利影响。

3.5(9,1.6,3.4,3.9,0.009,0.007,0.7)(,1,3,4,0.010,0.010,) 代表未明确指定的系数)。

level07level

(顺便说一下,使用回归中未转换的百分比等级不会定性地改变下面报告的结果。)

spread138

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      -4.902006   0.349924  -14.01  < 2e-16 ***
as.factor(year)2  0.605444   0.130355    4.64  3.9e-06 ***
as.factor(year)3  1.707590   0.134649   12.68  < 2e-16 ***
as.factor(year)4  1.926272   0.136595   14.10  < 2e-16 ***
math              0.004667   0.000448   10.41  < 2e-16 ***
verbal            0.004019   0.000434    9.25  < 2e-16 ***
level            -0.299475   0.026415  -11.34  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 1.3 on 883 degrees of freedom
Multiple R-squared: 0.282,  Adjusted R-squared: 0.277 
F-statistic: 57.9 on 6 and 883 DF,  p-value: <2e-16

班级分配图

spread38spread1

这次,R平方得到了很大的改善(尽管仍然不是很大)。但是,所有系数都增加了20-100%。下表将它们与其他一些模拟进行了比较:

Simulation Intercept Year.2 Year.3 Year.4 Math Verbal Level R^2
Beta               *    1.0    3.0    4.0 .010   .010     *   *
Spread=1        -2.6    0.5    1.0    1.1 .003   .002 -0.21  7%
Spread=38       -4.9    0.6    1.7    1.9 .005   .004 -0.30 25%
Ability=1       -8.3    0.9    2.6    3.3 .008   .008 -0.63 58%
No error       -11.2    1.1    3.3    4.4 .011   .011 -0.09 88%

spread38ability21abilitysigma0εiδi,jlevel

这种快速分析表明,至少如此处所述回归将把不可避免的变化形式与系数混淆。此外,系数还(在某种程度上)取决于学生在班级之间的分配方式。如此处所做的那样,可以通过在回归中的自变量中包括类属性来部分地容纳这种情况,但是即使如此,学生分布的影响也不会消失。

真实学生表现的任何可预测性的缺乏,以及学生学习和考试实际表现的任何变化,显然都会导致系数估计值缩小为零。他们似乎这样做是一致的,这表明相对系数可能仍然有意义。


εivipijyijyij

如果您的模拟保留了未观察到的能力与SAT和其他分数之间的正相关性,则OLS参数可能会向右上偏?(渐近偏向与控件-随机项的相关性成正比),因此这可以说明您的“负”参数是趋于零?
JDav

+1,我非常喜欢使用模拟来帮助统计工作。
gung-恢复莫妮卡

3

yij

μij

ln(yij/(1yij))=μij+eij+vi

vieijeijμij

(这只是我有偏见的一个想法,非常欢迎评论和批评家。)

μijvi


1
使用逻辑变换的想法是一个好主意,但是这种回归模型存在问题(如我的回答所述)。
ub

μij

2

ln(p1p)


Logistic回归适用于二元响应变量,它不会出现在这里是如此。您是否可能建议对等级百分比的对数进行普通回归?
ub

1
逻辑上的回归和普通的线性回归都不适用,这是whuber给出的原因。另外,如果模型要具有高斯残差,我将看不到如何将其转化为响应的近似均匀分布。我认为,排名中各个学生之间的依存关系对分析至关重要。
2012年

ln(p/1p)=βxi+uipi

@J Dav我无法找到您所描述的使用“逻辑回归”的任何参考文献。
ub

1
我认为他的意思是做一个带有条件高斯分布,对数均值的对数链接的广义线性模型。(至少我会假设这就是他的意思。)
Shea Parkes 2012年

0

在这种情况下,一个完美的模型会将输入(无论您有什么协变量)映射到输出(班级中学生的排名)。另一种思考的方式是先映射到分数,然后再将这些分数映射到等级。我现在暂时忽略错误。

y=βx

r=R(y)

RRyR(y)

这似乎与广义线性模型的功能形式非常相似。我认为这就是@Mike Anderson提出逻辑回归方法的原因。如果您的考试成绩是按逻辑分配的,则要使用的链接函数将是logit(其倒数是我们关注的累积密度函数)。同样,如果分数是正态分布的,则概率函数将是链接函数。

对于您的回归,估计排名的唯一方法是说“假设我的数据以X分布,这一点在第34个百分位数中”。否则,您如何知道测验分数提高2分对排名的影响?需要注意的是,您必须估计该分布才能选择链接功能(某些功能形式会使您的生活更加轻松)。此外,该模型不会说“您在38个类别中排名第六”,而是“如果按照我们认为的方式分配测试分数,您的分数将使您处于第15个百分位。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.