Дэвид Харрис дал отличный ответ , но, поскольку вопрос продолжает редактироваться, возможно, это поможет увидеть детали его решения. Основные моменты следующего анализа:
Взвешенные наименьшие квадраты, вероятно, более уместны, чем обычные наименьшие квадраты.
Поскольку оценки могут отражать различия в производительности вне контроля любого человека, будьте осторожны при использовании их для оценки отдельных работников.
Для этого давайте создадим некоторые реалистичные данные, используя указанные формулы, чтобы мы могли оценить точность решения. Это сделано с 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
является типичным пропорциональным отклонением; Например , приведенное здесь, соответствует типичному отклонению в 10% (которое в некоторых случаях может превышать 30%).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
«s lm
процедура просто завершается с ошибкой. Мы должны сначала проверить наличие таких пар. Один из способов - найти идеально соотнесенных работников в графике:
correlations <- cor(data)
outer(names(data), names(data), paste)[which(upper.tri(correlations) &
correlations >= 0.999999)]
В выходных данных будут перечислены пары всегда работающих пар: это можно использовать для объединения этих работников в группы, потому что, по крайней мере, мы можем оценить производительность каждой группы, если не отдельных лиц в ней. Мы надеемся, что это просто выплевывает character(0)
. Давайте предположим, что это так.
Один тонкий момент, подразумеваемый в вышеприведенном объяснении, заключается в том, что изменение выполняемой работы является мультипликативным, а не аддитивным. Это реалистично: разброс выпуска большой группы работников в абсолютном масштабе будет больше, чем разброс в меньших группах. Соответственно, мы получим лучшие оценки, используя взвешенные наименьшие квадраты, а не обычные наименьшие квадраты. Наилучшие веса, которые можно использовать в этой конкретной модели, являются взаимными величинами трудозатрат. (В случае, если некоторые суммы работы равны нулю, я добавляю небольшое количество, чтобы избежать деления на ноль.)
fit <- lm(work ~ . + 0, data=data, weights=1/(max(work)/10^3+work))
fit.sum <- summary(fit)
Это должно занять всего одну или две секунды.
Перед тем как продолжить, мы должны выполнить некоторые диагностические тесты подгонки. Хотя обсуждение этих вопросов приведет нас слишком далеко, одна R
команда для создания полезной диагностики
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")])
Гистограмма (нижняя левая панель рисунка ниже) представляет собой разницу между оценочной и фактической квалификацией, выраженную в виде кратных стандартной ошибке оценки. Для хорошей процедуры эти значения будут почти всегда лежать между и и будут симметрично распределены вокруг . Однако при участии 1000 работников мы полностью ожидаем увидеть некоторые из этих стандартизированных различий, которые простираются от и даже до2 0 3 4 0−220340, Это как раз тот случай: гистограмма настолько хороша, насколько можно было надеяться. (Конечно, это может быть приятно: в конце концов, это симулированные данные. Но симметрия подтверждает, что веса правильно выполняют свою работу. Использование неправильных весов приведет к асимметричной гистограмме.)
Диаграмма рассеяния (нижняя правая панель рисунка) напрямую сравнивает предполагаемые навыки с фактическими. Конечно, это не будет доступно в реальности, потому что мы не знаем фактических навыков: в этом заключается сила компьютерного моделирования. Заметим:
Если бы не было случайных изменений в работе (установите cv=0
и повторите код, чтобы увидеть это), диаграмма рассеяния была бы идеальной диагональной линией. Все оценки будут совершенно точными. Таким образом, рассмотренный здесь разброс отражает эту вариацию.
Иногда оценочное значение довольно далеко от фактического значения. Например, есть одна точка рядом (110, 160), где предполагаемая квалификация примерно на 50% выше, чем фактическая квалификация. Это почти неизбежно в любой большой партии данных. Помните об этом, если оценки будут использоваться на индивидуальной основе, например, для оценки работников. В целом эти оценки могут быть превосходными, но в той степени, в которой изменение производительности труда обусловлено причинами, не зависящими от какого-либо лица, тогда для некоторых работников оценки будут ошибочными: некоторые слишком высоки, некоторые слишком низки. И нет никакого способа точно сказать, кто затронут.
Вот четыре графика, сгенерированные во время этого процесса.
Наконец, обратите внимание, что этот метод регрессии легко адаптируется для контроля других переменных, которые, вероятно, могут быть связаны с производительностью группы. Они могут включать размер группы, продолжительность каждой работы, временную переменную, фактор для менеджера каждой группы и так далее. Просто включите их в качестве дополнительных переменных в регрессии.