回帰の従属変数としてのパーセンテージの推定


13

私の研究の従属変数として、38の試験の学生のランクの割合があります。ランクの割合は、(学生のランク/試験の学生数)によって計算されます。この従属変数の分布はほぼ均一であるため、従属変数に対するいくつかの変数の影響を推定したいと思います。

どの回帰アプローチを使用しますか?


2
正規(OLS)回帰は、従属変数の分布に関する仮定を行うのではなく、モデルからの誤差(残差によって推定される)の分布に関する仮定を行います。試験ごとの生徒数が異なる場合は、OLS回帰から始めて仮定を確認することができます。
ピーターフロム-モニカの復職

2
@Peter、これは良い提案ですが、私は、OLSの仮定の微妙でありながら重要な違反について心配しています。試験での学生のランクは、試験を受ける他のすべての学生の属性に依存します。この相互依存関係は、OLSの(通常の)アプリケーションではキャプチャされません。
whuber

ここで何が起こっているかを評価する別の方法は、この「問題」の最も単純な例を検討することです。各「試験」には正確に2人の生徒が含まれます。従属変数は、どの生徒の成績が良いかを示します。各試験をコンテストと考えると、これはトーナメントを開催することに相当します。質問は、実際には、いくつかの説明変数の観点から各プレーヤーの「強さ」の公式を考え出したいと考えています。
whuber

あなたは正しい@whuberです。これに対処する方法は?IRTモデルがそれを行うと思いますが、私がそれらを研究してから長い時間がかかりました。
ピーターフロム-モニカの復職

@whuber IRTは可能性があると思います。たとえば、プロビット(またはロジット)の順序です。しかし、割合ランクを有界連続変数(マイクが提案したロジスティック回帰のように)と見なすことも可能です。これは有効な近似であり、一方、順序プロビットは問題に対する直線モデルです。ロジスティックの利点は節約です。学生の相関関係を説明するために、ホワイトまたはサンドイッチ分散推定量を実装できます。サンプルには複数の学生(縦断)の38の試験があるので、これは可能であるはずです。
JDav

回答:


3

Stataを使用している場合は、次の例をご覧ください。http//www.ats.ucla.edu/stat/stata/faq/proportion.htm

このウェブページからの引用はここにあります:

「従属変数がプロポーションの場合、どのように回帰を行いますか?

割合データの値は、0から1の間です。当然、予測値も0と1の間に収まると便利です。これを実現する1つの方法は、ロジットリンクと二項族を持つ一般化線形モデル(glm)を使用することです。堅牢なオプションをglmモデルに含めて、堅牢な標準誤差を取得します。これは、分布ファミリを誤って指定した場合に特に役立ちます。」


2
それは素晴らしいことであり、他のコンテキストでは素晴らしいアドバイスになりますが、glmを使用しても、私の答えで特定された問題を解決することはできません。
whuber


9

あらすじ

回帰結果は、慎重に解釈すると限られた価値しか持たない場合があります。変動の避けられない形式は、係数推定値を実質的にゼロに向かって縮小させます。より適切な方法でバリエーションを処理する、より良いモデルが必要です。

(最尤モデルを構築できますが、多次元積分の数値評価を伴う計算が必要なため、実行不可能な場合があります。次元の数は、クラスに登録されている生徒の数に等しくなります。)

前書き

直感を伝える物語として、これらの38の試験は、200人の大学生が在籍する小さな学校の1学期に38の個別のコースで行われたと想像してください。現実的な状況では、これらの学生はさまざまな能力と経験を持ちます。これらの能力と経験の代用手段として、たとえば、SAT数学と言語テストの成績、および大学の1年(1〜4)を採ることがあります。

通常、生徒は能力と興味に応じてコースに登録します。新入生は入門コースを受講し、入門コースは主に新入生が居住しています。上級生、才能のある新入生、2年生は、上級および大学院レベルのコースを受講します。 この選択により、生徒が部分的に層化されるため、通常、クラス内の生徒の生来の能力は、学校全体の能力の広がりよりも均一になります。

したがって、最も有能な学生は、自分が入学する困難で高度なクラスの最下部近くで得点し、最少の学生は、簡単な入門クラスの最上部近くで得点することがあります。これは、試験ランクを学生とクラスの属性に直接関連付ける直接的な試みを混乱させる可能性があります。

分析

インデックスを持つ学生および学生の属性聞かせて私は、ベクトルで与えられるが、xは、私を。インデックスを持つクラスJとは、クラスの属性せjは、ベクトルで与えられるのz J。クラスjに登録されている学生のセットはA jです。バツjjzjjAj

各生徒の「強さ」s iは、その属性とランダムな値の関数であり、平均値はゼロであると仮定します。s

s=fバツβ+ε

クラスの試験は、クラスに登録されている各生徒の強さに独立したランダムな値を追加し、それらをランクに変換することでモデル化します。ここで、学生iがクラスjに登録されている場合、それらの相対ランクr i jは、値のソートされた配列内の位置によって決定されますjjrj

sk+δkjkAj

この位置クラスの合計登録数よりも1つ多く割って、従属変数であるパー​​セントランクを与えます。rj

pj=rj1+|Aj|

Iは、回帰結果がランダム(未観測)値の大きさや構造に(かなり)依存すると主張及びδ 、I Jをεδ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大きくなる傾向があるが試験結果は、生徒の体力データからほとんど予測できません。クラスが「簡単」でない場合、これらのランダムな用語は無視できるほど小さく、生徒の体力が試験ランキングを完全に決定できます。δ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")

学生は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年間に記録されていない「能力」値によるものです。εbetabeta

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δj.01.2

生徒に能力に合ったコースを選択させます。それができたら、クラスサイズを計算し、classes後で使用するためにそれらをデータフレームに格納します。値spreadでのassignments <-...行は、学生が能力によってクラスに区分されている方法を密接に決定します。近い値は、基本的に最も弱い学生と最も簡単なコースを組み合わせます。クラスの数に近い値は、生徒をもう少し広げます。それよりもはるかに大きな値は、弱い学生を最も難しいコースに入れる傾向があるため、非現実的になり始めます。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)))

(このステップが達成したことの例として、以下の図を参照してください。)

ここでモデルを適用します:各クラスの生徒の能力は独立して変化します-試験のスコアを決定するために、簡単な試験の方が難しく、難しい(差別的な)試験の方が少なくなります。これらは、ランクおよびランクパーセントである「いたずら」として要約されます。クラスのいたずら学生は範囲1 /N + 1 を介して、N /N + 1 の増分で1 /N + 1 。これにより、ロジスティック関数などの変換を後で適用できるようになります(これは、n1/(n+1)n/(n+1)1/(n+1)または 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))

これらの生データに、学生とクラスの属性を添付して、分析に適したデータセットを作成します。

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))は高速に見えます。残差はホモセダスティックであり、美しく正常です(わずかに短いテールですが、問題ありません)。外れ値なし; また、いかなる観測においても悪影響はありません。

3.591.63.43.90.0090.0070.71340.0100.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の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%

spread38ability21abilitysigma0εδjlevel

この簡単な分析は、少なくともここで実行されたように、回帰が係数との避けられない変化を混同することを示しています。さらに、係数は(ある程度)学生がクラス間でどのように分布しているかにも依存します。これは、ここで行われているように、回帰の独立変数にクラス属性を含めることで部分的に対応できますが、それでも学生の分布の影響は消えません。

真の生徒の成績の予測可能性の欠如、および生徒の学習のばらつきと試験の実際の成績により、係数の推定値がゼロに向かって縮小するようです。それらは一様にそうであるように見え、相対係数がまだ意味があるかもしれないことを示唆しています。


εvpjyjyj

シミュレーションが観測されていない能力とSATおよび他のスコアとの正の相関を保持している場合、OLSパラメーターは右に上向きにバイアスされる可能性があります(asymp。バイアスはコントロールとランダム項の相関に比例します)。ゼロに向かって引き寄せられた?
JDav

+1、私はシミュレーションを使用して統計的アイデアを処理するのが大好きです。
GUNG -復活モニカ

3

yij

μij

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

vieijeijμij

(これは私の偏った経験からの単なるアイデアであり、コメントや批評家は大歓迎です。)

μijvi


1
ロジスティック変換を使用するというアイデアは良いものですが、この種の回帰モデルには問題があります(私の答えで説明したように)。
whuber

μij

2

lnp1p


ロジスティック回帰はバイナリ応答変数にのみ適用されますが、ここではそうではないようです。ランクの割合のロジットの通常の回帰をおそらく提案していますか?
whuber

1
ここでは、whuberが与えた理由から、ロジスティック回帰も通常の線形回帰も適切ではありません。また、モデルがガウス残差を持つ場合、それがどのように応答のほぼ均一な分布に変換されるのかわかりません。ランキングにおける個々の学生間の依存関係は、分析にとって最も重要だと思います。
マイケルR.チャーニック

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

@J Davあなたが説明する意味で「ロジスティック回帰」を使用する参照を見つけることができません。
whuber

1
彼は、条件付きガウス分布で、平均へのロジットリンクで、一般化線形モデルを実行するつもりだと思います。(少なくとも、それが彼の意図したことだと思います。)
シアパークス

0

この場合の完全なモデルは、入力(あなたが持っている共変量)を出力(クラスの生徒のランク)にマップします。これを考えるもう1つの方法は、最初にスコアにマッピングし、次にそれらのスコアをランクにマッピングすることです。今はエラーを無視します。

y=βx

r=R(y)

RRyR(y)

これは、一般化線形モデルの機能形式と非常によく似ています。これが、@ Mike Andersonがロジスティック回帰アプローチを提案した理由だと思います。試験のスコアがロジスティックに分布している場合、使用するリンク関数はロジットになります(その逆は、気になる累積密度関数です)。同様に、スコアが正規分布している場合、プロビット関数はリンク関数になります。

回帰の場合、ランクを推定する唯一の方法は、「私のデータがXとして配布されている場合、このポイントは34パーセンタイルにある」と言うことです。それ以外の場合、テストスコアの2ポイントの増加がランクの点でどのように変換されるかをどのように知るのですか?注意点は、リンク関数を選択するためにその分布を推定する必要があるということです(特定の関数形式はあなたの人生をずっと楽にします)。さらに、このモデルは「あなたが38のクラスの中で6番目にベストだった」と言うのではなく、「テストスコアが私たちの考え通りに分布していれば、あなたのスコアは15パーセンタイルになります。」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.