David Harris a fourni une excellente réponse , mais comme la question continue d'être modifiée, il serait peut-être utile de voir les détails de sa solution. Les points saillants de l'analyse suivante sont les suivants:
Les moindres carrés pondérés sont probablement plus appropriés que les moindres carrés ordinaires.
Étant donné que les estimations peuvent refléter des variations de productivité indépendantes de la volonté de tout individu, soyez prudent lorsque vous les utilisez pour évaluer des travailleurs individuels.
Pour ce faire, créons des données réalistes à l' aide de formules spécifiées afin d'évaluer la précision de la solution. Cela se fait avec 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)
Dans ces étapes initiales, nous:
Définissez une valeur de départ pour le générateur de nombres aléatoires afin que n'importe qui puisse reproduire exactement les résultats.
Précisez le nombre de travailleurs avec n.names
.
Déterminez le nombre prévu de travailleurs par groupe avec groupSize
.
Spécifiez le nombre de cas (observations) disponibles avec n.cases
. (Plus tard, certains d'entre eux seront éliminés car ils ne correspondent, comme cela arrive au hasard, à aucun des travailleurs de notre main-d'œuvre synthétique.)
cv
0,10
Créez une main-d'œuvre composée de personnes aux compétences professionnelles variées. Les paramètres donnés ici pour l'informatique proficiency
créent une plage de plus de 4: 1 entre les meilleurs et les pires travailleurs (ce qui, selon mon expérience, peut même être un peu étroit pour les emplois technologiques et professionnels, mais peut-être est large pour les emplois de fabrication de routine).
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)
J'ai trouvé qu'il était pratique de mettre toutes les données du groupe de travail dans une seule trame de données pour l'analyse, mais de garder les valeurs de travail séparées:
data <- data.frame(schedule)
C'est là que nous commencerions avec des données réelles: nous aurions le groupe de travailleurs encodé par data
(ou schedule
) et les sorties de travail observées dans le work
tableau.
Malheureusement, si certains travailleurs sont toujours jumelés, R
la lm
procédure de échoue simplement avec une erreur. Nous devons d'abord vérifier ces appariements. Une façon consiste à trouver des travailleurs parfaitement corrélés dans le calendrier:
correlations <- cor(data)
outer(names(data), names(data), paste)[which(upper.tri(correlations) &
correlations >= 0.999999)]
La sortie listera des paires de travailleurs toujours appariés: cela peut être utilisé pour combiner ces travailleurs en groupes, car au moins nous pouvons estimer la productivité de chaque groupe, sinon les individus qui le composent. Nous espérons que ça crache character(0)
. Supposons que ce soit le cas.
Un point subtil, implicite dans l'explication qui précède, est que la variation du travail effectué est multiplicative et non additive. Ceci est réaliste: la variation de la production d'un grand groupe de travailleurs sera, sur une échelle absolue, plus grande que la variation dans des groupes plus petits. Par conséquent, nous obtiendrons de meilleures estimations en utilisant les moindres carrés pondérés plutôt que les moindres carrés ordinaires. Les meilleurs poids à utiliser dans ce modèle particulier sont les inverses des montants de travail. (Dans le cas où certains montants de travail sont nuls, je fausse ceci en ajoutant un petit montant pour éviter de diviser par zéro.)
fit <- lm(work ~ . + 0, data=data, weights=1/(max(work)/10^3+work))
fit.sum <- summary(fit)
Cela ne devrait prendre qu'une ou deux secondes.
Avant de continuer, nous devons effectuer des tests de diagnostic de l'ajustement. Bien que les discuter nous mènerait trop loin ici, une R
commande pour produire des diagnostics utiles est
plot(fit)
(Cela prendra quelques secondes: c'est un grand ensemble de données!)
Bien que ces quelques lignes de code fassent tout le travail et génèrent des compétences estimées pour chaque travailleur, nous ne voudrions pas parcourir les 1000 lignes de sortie - du moins pas tout de suite. Utilisons graphiques pour afficher les résultats .
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. C'est exactement le cas ici: l'histogramme est aussi joli qu'on pourrait l'espérer. (Une chose pourrait bien sûr être agréable: ce sont des données simulées, après tout. Mais la symétrie confirme que les poids font leur travail correctement. L'utilisation de mauvais poids aura tendance à créer un histogramme asymétrique.)
Le nuage de points (panneau inférieur droit de la figure) compare directement les compétences estimées aux compétences réelles. Bien sûr, cela ne serait pas disponible dans la réalité, car nous ne connaissons pas les compétences réelles: c'est là que réside la puissance de la simulation informatique. Observer:
S'il n'y avait pas eu de variation aléatoire dans le travail (définir cv=0
et réexécuter le code pour le voir), le nuage de points serait une ligne diagonale parfaite. Toutes les estimations seraient parfaitement exactes. Ainsi, la dispersion observée ici reflète cette variation.
Parfois, une valeur estimée est assez éloignée de la valeur réelle. Par exemple, il y a un point près (110, 160) où la compétence estimée est environ 50% supérieure à la compétence réelle. Cela est presque inévitable dans tout grand lot de données. Gardez cela à l'esprit si les estimations seront utilisées sur une base individuelle , par exemple pour évaluer les travailleurs. Dans l'ensemble, ces estimations peuvent être excellentes, mais dans la mesure où la variation de la productivité du travail est due à des causes indépendantes de la volonté de tout individu, alors pour quelques-uns des travailleurs, les estimations seront erronées: certaines trop élevées, d'autres trop faibles. Et il n'y a aucun moyen de dire précisément qui est touché.
Voici les quatre graphiques générés au cours de ce processus.
Enfin, notez que cette méthode de régression est facilement adaptée pour contrôler d'autres variables qui pourraient vraisemblablement être associées à la productivité du groupe. Il peut s'agir de la taille du groupe, de la durée de chaque effort de travail, d'une variable de temps, d'un facteur pour le responsable de chaque groupe, etc. Il suffit de les inclure comme variables supplémentaires dans la régression.