我将38项考试中学生的排名百分比作为我研究中的因变量。排名百分比由(学生的等级/考试中的学生人数)计算得出。这个因变量具有几乎均匀的分布,我想估计一些变量对因变量的影响。
我使用哪种回归方法?
我将38项考试中学生的排名百分比作为我研究中的因变量。排名百分比由(学生的等级/考试中的学生人数)计算得出。这个因变量具有几乎均匀的分布,我想估计一些变量对因变量的影响。
我使用哪种回归方法?
Answers:
如果您正在使用Stata,请查看以下示例:http : //www.ats.ucla.edu/stat/stata/faq/proportion.htm
这是此网页的引文:
“当因变量为比例时,如何回归?
比例数据的值介于零到一之间。自然地,使预测值也落在零和一之间会很好。实现此目的的一种方法是使用具有logit链接和二项式族的广义线性模型(glm)。我们将在glm模型中包含鲁棒的选项,以获取鲁棒的标准误差,如果我们未正确指定分发系列,该方法将特别有用。
如果仔细解释,回归结果可能会有一些局限性。不可避免的变化形式将导致系数估计值大幅缩小至零。需要一个更好的模型,以更合适的方式处理变化。
(可以构造一个最大似然模型,但由于需要进行计算,因此可能不可行,该计算涉及对多维积分的数值评估。维度的数量等于在该课程中注册的学生的数量。)
为了说明我们的直觉,请想象一下,这38项考试是在一所小学校的一个学期中有38个单独的课程进行的,招收了200名大学生。在现实情况下,这些学生将具有不同的能力和经验。作为对这些能力和经验的替代衡量,我们可能会在SAT数学和语言测试以及大学一年级(1-4年)中取得分数。
通常,学生将根据自己的能力和兴趣参加课程。新生参加入门课程,入门课程主要由新生组成。高年级生,才华横溢的新生和大二学生都可以参加高级和研究生课程。 这种选择对学生进行了部分分层,因此任何班级学生的先天能力通常比整个学校的能力分布更加同质。
因此,能力最强的学生可能会发现自己在所报读的困难,高级课程的最低分数附近得分,而能力最差的学生可能会在其所参加的简单入门课程的最高分数附近得分。这可能会使直接将考试等级与学生和班级的属性直接联系起来的尝试混淆。
用索引学生,并通过向量x i给出学生i的属性。用j索引类,并通过向量z j给出类j的属性。参加j班的学生人数为A j。
假设“实力”的每个学生是他们的属性的功能,再加上一些随机值,这也可以具有零均值:
我们通过将独立的随机值添加到该课程中注册的每个学生的实力并将其转换为等级来对类中的考试进行建模。如果学生参加了课程,则他们的相对排名由他们在值的排序数组中的位置确定我Ĵ [R 我,Ĵ
这个位置被除以总班级人数再除以一,就可以得出因变量,即百分比等级:
无需过多的努力,我们就可以模拟这种情况来创建和分析一些样本数据。模拟的一个优点是它可以融合学生的真实优势,而这在现实中是无法观察到的。另一个是我们可以改变未观察值的典型大小以及类分配。这为评估提议的分析方法(例如回归)提供了一个“沙盒”。
首先,让我们将随机数生成器设置为可重现的结果,并指定问题的大小。我使用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
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")
beta
beta
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$ability
beta$ability
beta$sigma
ease
classes
spread
assignments <-...
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)))
(有关此步骤完成情况的示例,请参见下图。)
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)
)看起来是快速的:残差是等方差的,并且是正常的(尽管尾巴略短,这没问题);没有异常值;并且在任何观察中都没有不利影响。
代表未明确指定的系数)。
level
level
(顺便说一下,使用回归中未转换的百分比等级不会定性地改变下面报告的结果。)
spread
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
spread
spread
1
这次,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%
spread
ability
ability
sigma
level
这种快速分析表明,至少如此处所述,回归将把不可避免的变化形式与系数混淆。此外,系数还(在某种程度上)取决于学生在班级之间的分配方式。如此处所做的那样,可以通过在回归中的自变量中包括类属性来部分地容纳这种情况,但是即使如此,学生分布的影响也不会消失。
真实学生表现的任何可预测性的缺乏,以及学生学习和考试实际表现的任何变化,显然都会导致系数估计值缩小为零。他们似乎这样做是一致的,这表明相对系数可能仍然有意义。
在这种情况下,一个完美的模型会将输入(无论您有什么协变量)映射到输出(班级中学生的排名)。另一种思考的方式是先映射到分数,然后再将这些分数映射到等级。我现在暂时忽略错误。
这似乎与广义线性模型的功能形式非常相似。我认为这就是@Mike Anderson提出逻辑回归方法的原因。如果您的考试成绩是按逻辑分配的,则要使用的链接函数将是logit(其倒数是我们关注的累积密度函数)。同样,如果分数是正态分布的,则概率函数将是链接函数。
对于您的回归,估计排名的唯一方法是说“假设我的数据以X分布,这一点在第34个百分位数中”。否则,您如何知道测验分数提高2分对排名的影响?需要注意的是,您必须估计该分布才能选择链接功能(某些功能形式会使您的生活更加轻松)。此外,该模型不会说“您在38个类别中排名第六”,而是“如果按照我们认为的方式分配测试分数,您的分数将使您处于第15个百分位。”