私の研究の従属変数として、38の試験の学生のランクの割合があります。ランクの割合は、(学生のランク/試験の学生数)によって計算されます。この従属変数の分布はほぼ均一であるため、従属変数に対するいくつかの変数の影響を推定したいと思います。
どの回帰アプローチを使用しますか?
私の研究の従属変数として、38の試験の学生のランクの割合があります。ランクの割合は、(学生のランク/試験の学生数)によって計算されます。この従属変数の分布はほぼ均一であるため、従属変数に対するいくつかの変数の影響を推定したいと思います。
どの回帰アプローチを使用しますか?
回答:
Stataを使用している場合は、次の例をご覧ください。http://www.ats.ucla.edu/stat/stata/faq/proportion.htm
このウェブページからの引用はここにあります:
「従属変数がプロポーションの場合、どのように回帰を行いますか?
割合データの値は、0から1の間です。当然、予測値も0と1の間に収まると便利です。これを実現する1つの方法は、ロジットリンクと二項族を持つ一般化線形モデル(glm)を使用することです。堅牢なオプションをglmモデルに含めて、堅牢な標準誤差を取得します。これは、分布ファミリを誤って指定した場合に特に役立ちます。」
回帰結果は、慎重に解釈すると限られた価値しか持たない場合があります。変動の避けられない形式は、係数推定値を実質的にゼロに向かって縮小させます。より適切な方法でバリエーションを処理する、より良いモデルが必要です。
(最尤モデルを構築できますが、多次元積分の数値評価を伴う計算が必要なため、実行不可能な場合があります。次元の数は、クラスに登録されている生徒の数に等しくなります。)
直感を伝える物語として、これらの38の試験は、200人の大学生が在籍する小さな学校の1学期に38の個別のコースで行われたと想像してください。現実的な状況では、これらの学生はさまざまな能力と経験を持ちます。これらの能力と経験の代用手段として、たとえば、SAT数学と言語テストの成績、および大学の1年(1〜4)を採ることがあります。
通常、生徒は能力と興味に応じてコースに登録します。新入生は入門コースを受講し、入門コースは主に新入生が居住しています。上級生、才能のある新入生、2年生は、上級および大学院レベルのコースを受講します。 この選択により、生徒が部分的に層化されるため、通常、クラス内の生徒の生来の能力は、学校全体の能力の広がりよりも均一になります。
したがって、最も有能な学生は、自分が入学する困難で高度なクラスの最下部近くで得点し、最少の学生は、簡単な入門クラスの最上部近くで得点することがあります。これは、試験ランクを学生とクラスの属性に直接関連付ける直接的な試みを混乱させる可能性があります。
インデックスを持つ学生および学生の属性聞かせて私は、ベクトルで与えられるが、xは、私を。インデックスを持つクラスJとは、クラスの属性せjは、ベクトルで与えられるのz J。クラスjに登録されている学生のセットはA jです。
各生徒の「強さ」s iは、その属性とランダムな値の関数であり、平均値はゼロであると仮定します。
クラスの試験は、クラスに登録されている各生徒の強さに独立したランダムな値を追加し、それらをランクに変換することでモデル化します。ここで、学生iがクラスjに登録されている場合、それらの相対ランクr i 、jは、値のソートされた配列内の位置によって決定されます
この位置クラスの合計登録数よりも1つ多く割って、従属変数であるパーセントランクを与えます。
Iは、回帰結果がランダム(未観測)値の大きさや構造に(かなり)依存すると主張及びδ 、I 、Jを。 結果は、生徒がどのようにクラスに登録されているかによっても異なります。これは直感的に明らかなはずですが、それほど明白ではない-理論的に分析するのが難しいと思われるのは、観測されていない値とクラス構造が回帰にどのようにどの程度影響するかです。
あまり労力をかけることなく、この状況をシミュレートしてサンプルデータを作成および分析できます。シミュレーションの利点の1つは、実際には観察できない学生の真の強みを組み込むことができることです。もう1つは、観測されていない値の典型的なサイズとクラスの割り当てを変更できることです。これにより、回帰などの分析方法の提案を評価するための「サンドボックス」が提供されます。
開始するには、再現可能な結果を得るために乱数ジェネレーターを設定し、問題のサイズを指定しましょう。私が使用し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
には、さまざまな学問レベル(1 =入門から7 =研究まで)で、簡単に可変できる2つのスケール(数学と言語、負の相関関係)でさまざまな難易度のクラスを作成します。(「簡単な」クラスでは、学生の学習の量の違いが大きくなることがあり、および/または試験は学生の間ではほとんど区別を提供することができる。これは、ランダムな用語によってモデル化されたクラスのために、というJ大きくなる傾向があるが試験結果は、生徒の体力データからほとんど予測できません。クラスが「簡単」でない場合、これらのランダムな用語は無視できるほど小さく、生徒の体力が試験ランキングを完全に決定できます。
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")
学生は4年間に分散し、属性のランダムな値を与えられます。これらの属性の間に相関関係はありません。
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")
モデルは、各学生が本来の「強さ」は、部分的にそれらの属性によって、一部でその「力」によって決定されたことである値。 他の属性の観点から強度を決定する強度係数は、後続のデータ分析が推定しようとするものです。 このシミュレーションを使用する場合は、を変更してください。以下は、大学全体で継続的に学生が学習していることを反映した興味深い現実的な係数のセットです(2年目から3年目までの間に大量)。SATの各部分の100ポイントは、約1年間の学校の価値があります。そして、約半分の変動は、SATスコアまたは学校での1年間に記録されていない「能力」値によるものです。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
を乗算します。 δ I 、jは与えられたコースで学生の強みの範囲に関連し。周り値.01へ.2そうか、私には合理的なようです。)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)))
(このステップが達成したことの例として、以下の図を参照してください。)
ここでモデルを適用します:各クラスの生徒の能力は独立して変化します-試験のスコアを決定するために、簡単な試験の方が難しく、難しい(差別的な)試験の方が少なくなります。これらは、ランクおよびランクパーセントである「いたずら」として要約されます。クラスのいたずら学生は範囲1 /(N + 1 )を介して、N /(N + 1 )の増分で1 /(N + 1 )。これにより、ロジスティック関数などの変換を後で適用できるようになります(これは、または 1)。
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))
これらの生データに、学生とクラスの属性を添付して、分析に適したデータセットを作成します。
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の2年生です。全体的な固有の学力は16.9です。彼らは当時4つのクラスに登録されていました。
このデータセットは、質問の説明と一致しています。たとえば、パーセンテージランクは実際にはほぼ均一です(1つのクラスのパーセンテージランクは離散的な均一分布を持っているため、完全なデータセットである必要があります)。
の係数により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の2乗が大幅に改善されています(それでもまだ素晴らしいとは言えません)。ただし、すべての係数は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
この簡単な分析は、少なくともここで実行されたように、回帰が係数との避けられない変化を混同することを示しています。さらに、係数は(ある程度)学生がクラス間でどのように分布しているかにも依存します。これは、ここで行われているように、回帰の独立変数にクラス属性を含めることで部分的に対応できますが、それでも学生の分布の影響は消えません。
真の生徒の成績の予測可能性の欠如、および生徒の学習のばらつきと試験の実際の成績により、係数の推定値がゼロに向かって縮小するようです。それらは一様にそうであるように見え、相対係数がまだ意味があるかもしれないことを示唆しています。
この場合の完全なモデルは、入力(あなたが持っている共変量)を出力(クラスの生徒のランク)にマップします。これを考えるもう1つの方法は、最初にスコアにマッピングし、次にそれらのスコアをランクにマッピングすることです。今はエラーを無視します。
これは、一般化線形モデルの機能形式と非常によく似ています。これが、@ Mike Andersonがロジスティック回帰アプローチを提案した理由だと思います。試験のスコアがロジスティックに分布している場合、使用するリンク関数はロジットになります(その逆は、気になる累積密度関数です)。同様に、スコアが正規分布している場合、プロビット関数はリンク関数になります。
回帰の場合、ランクを推定する唯一の方法は、「私のデータがXとして配布されている場合、このポイントは34パーセンタイルにある」と言うことです。それ以外の場合、テストスコアの2ポイントの増加がランクの点でどのように変換されるかをどのように知るのですか?注意点は、リンク関数を選択するためにその分布を推定する必要があるということです(特定の関数形式はあなたの人生をずっと楽にします)。さらに、このモデルは「あなたが38のクラスの中で6番目にベストだった」と言うのではなく、「テストスコアが私たちの考え通りに分布していれば、あなたのスコアは15パーセンタイルになります。」