David Harrisは素晴らしい答えを提供してくれましたが、質問は引き続き編集されているため、おそらく彼の解決策の詳細を確認するのに役立ちます。以下の分析のハイライトは次のとおりです。
これを実行するには、指定された式を使用して現実的なデータを作成して、ソリューションの精度を評価できるようにします。これはR
:
set.seed(17)
n.names <- 1000
groupSize <- 3.5
n.cases <- 5 * n.names # Should exceed n.names
cv <- 0.10 # Must be 0 or greater
groupSize <- 3.5 # Must be greater than 0
proficiency <- round(rgamma(n.names, 20, scale=5)); hist(proficiency)
これらの最初のステップでは、次のことを行います。
誰でも正確に結果を再現できるように、乱数ジェネレータのシードを設定します。
で働くワーカーの数を指定しますn.names
。
でグループあたりの予想労働者数を規定しgroupSize
ます。
で使用できるケース(観測)の数を指定しn.cases
ます。(後でこれらはランダムに発生するため、合成労働力の労働者には対応しないため、いくつか削除されます。)
cv
0.10
さまざまな業務能力を持つ人々の労働力を創出します。ここで計算用に与えられたパラメーターproficiency
は、最高の労働者と最悪の労働者の間に4:1を超える範囲を生み出します(私の経験では、これはテクノロジーや専門職の仕事には少し狭いかもしれませんが、日常の製造業にはおそらく広いです)。
schedule
1
schedule <- matrix(rbinom(n.cases * n.names, 1, groupSize/n.names), nrow=n.cases)
schedule <- schedule[apply(schedule, 1, sum) > 0, ]
work <- round(schedule %*% proficiency * exp(rnorm(dim(schedule)[1], -cv^2/2, cv)))
hist(work)
分析のためにすべてのワークグループデータを単一のデータフレームに入れるのが便利ですが、作業値を分離しておくと便利です。
data <- data.frame(schedule)
これは、実際のデータから始める場所です。data
(またはschedule
)によってエンコードされたワーカーグループと、work
配列内の観測された作業出力を使用します。
残念ながら、一部のワーカーが常にペアリングされている場合、R
のlm
手順は単にエラーで失敗します。 最初にそのようなペアリングを確認する必要があります。1つの方法は、スケジュールで完全に相関するワーカーを見つけることです。
correlations <- cor(data)
outer(names(data), names(data), paste)[which(upper.tri(correlations) &
correlations >= 0.999999)]
出力には常にペアになっているワーカーのペアが一覧表示されます。これは、これらのワーカーをグループに結合するために使用できます。少なくとも、グループ内の個人ではないとしても、各グループの生産性を推定できるためです。私たちはそれがちょうど吐き出すことを望みcharacter(0)
ます。それがあると仮定しましょう。
前述の説明で暗に示されている微妙な点の1つは、実行される作業の変化は乗法的であり、加法的ではないことです。これは現実的です。大規模な労働者グループの生産量の変動は、絶対的な規模では、小規模なグループの変動よりも大きくなります。したがって、通常の最小二乗法ではなく、加重最小二乗法を使用することで、より適切な推定が得られます。この特定のモデルで使用するのに最適な重みは、作業量の逆数です。(一部の作業量がゼロの場合、ゼロで除算しないように少量を追加してこれを回避します。)
fit <- lm(work ~ . + 0, data=data, weights=1/(max(work)/10^3+work))
fit.sum <- summary(fit)
これには1秒か2秒かかります。
先に進む前に、フィットのいくつかの診断テストを実行する必要があります。それらを議論することはここではあまりにも遠くに連れて行きますが、R
有用な診断を生成するための1つのコマンドは
plot(fit)
(これには数秒かかります:これは大きなデータセットです!)
これらの数行のコードがすべての作業を実行し、各ワーカーの推定熟練度を吐き出しますが、少なくともすぐには、1000行すべての出力をスキャンする必要はありません。 グラフィックを使用して結果を表示してみましょう。
fit.coef <- coef(fit.sum)
results <- cbind(fit.coef[, c("Estimate", "Std. Error")],
Actual=proficiency,
Difference=fit.coef[, "Estimate"] - proficiency,
Residual=(fit.coef[, "Estimate"] - proficiency)/fit.coef[, "Std. Error"])
hist(results[, "Residual"])
plot(results[, c("Actual", "Estimate")])
−220340。これはまさにここに当てはまります:ヒストグラムは期待できるほどきれいです。(当然のことながら、これらはシミュレートされたデータです。しかし、対称性により、重みが正しく機能していることが確認されます。間違った重みを使用すると、非対称のヒストグラムが作成される傾向があります。)
散布図(図の右下のパネル)は、推定された習熟度を実際の習熟度と直接比較します。もちろん、実際の熟練度がわからないため、これは実際には利用できません。ここに、コンピュータシミュレーションの力があります。観察する:
作業にランダムな変化がない場合(cv=0
これを確認するためにコードを設定して再実行する)、散布図は完全な対角線になります。すべての見積もりは完全に正確です。したがって、ここで見られるばらつきはその変動を反映しています。
場合によっては、推定値が実際の値からかなり離れていることがあります。たとえば、(110、160)の近くに1つのポイントがあり、推定される習熟度は実際の習熟度よりも約50%高くなっています。これは、データの大規模なバッチではほとんど避けられません。推定値が労働者の評価など、個別に使用される場合は、このことを覚えておいてください。概してこれらの推定値は優れている可能性がありますが、仕事の生産性のばらつきが個人の制御が及ばない原因によるものである場合、一部の労働者にとって推定値は誤っています。高すぎるもの、低すぎるものがあります。また、影響を受けるユーザーを正確に特定する方法はありません。
これは、このプロセス中に生成された4つのプロットです。
最後に、この回帰方法は、グループの生産性に関連している可能性がある他の変数を制御するために簡単に適応できることに注意してください。これらには、グループサイズ、各作業時間、時間変数、各グループのマネージャーの係数などが含まれます。それらを回帰の追加変数として含めるだけです。