frontier

frontierCost

##set_frontier

Description

L'action frontierCost est dédiée à l'analyse de modèles de frontières de coûts stochastiques. Dans le monde merveilleux de l'économétrie, elle permet de modéliser la fonction de coût minimum d'une entité (entreprise, hôpital, banque) et de mesurer son inefficacité. Contrairement aux modèles de production où l'on veut être au-dessus, ici, si vous êtes au-dessus de la frontière, c'est que vous dépensez trop ! Cette action supporte plusieurs distributions pour le terme d'inefficacité (exponentielle, demi-normale ou normale tronquée), ce qui est bien plus précis que de simplement blâmer la comptabilité.

Syntaxe Officielle
frontier.frontierCost /
bounds={"string-1", "string-2", ...},
class={{countMissing=true|false, descending=true|false, ignoreMissing=true|false, maxLev=integer, order="FORMATTED"|"FREQ"|"FREQFORMATTED"|"FREQINTERNAL"|"INTERNAL", param="BTH"|"EFFECT"|"GLM"|"ORDINAL"|"ORTHBTH"|"ORTHEFFECT"|"ORTHORDINAL"|"ORTHPOLY"|"ORTHREF"|"POLYNOMIAL"|"REFERENCE", ref="FIRST"|"LAST"|double|"string", vars={"variable-name-1", "variable-name-2", ...}}},
display={caseSensitive=true|false, exclude=true|false, excludeAll=true|false, keyIsPath=true|false, names={"string-1", "string-2", ...}, pathType="LABEL"|"NAME", traceNames=true|false},
freq="variable-name",
includeinternalnames=true|false,
initialvalues={"string-1", "string-2", ...},
model={depVars={{name="variable-name", options={descending=true|false, event="FIRST"|"LAST"|double|"string", levelType="BINARY"|"INTERVAL"|"NOMINAL"|"ORDINAL", order="FORMATTED"|"FREQ"|"FREQFORMATTED"|"FREQINTERNAL"|"INTERNAL", ref="FIRST"|"LAST"|double|"string"}}}, effects={{interaction="BAR"|"CROSS"|"NONE", maxInteract=integer, nest={"string-1", ...}, vars={"string-1", ...}}}, modelOptions={corrb=true|false, covb=true|false, depVarSummary=true|false, modelLabel="string", noint=true|false, type="EXPONENTIAL"|"HALF"|"TRUNCATED"}},
optimizer={aftl=double, agtl=double, algorithm="CONJUGATEGRADIENT"|"DOUBLEDOGLEG"|"NEWTONRAPHSONWITHLINESEARCH"|"NEWTONRAPHSONWITHRIDGING"|"NONE"|"QUASINEWTON"|"TRUSTREGION", atol=double, axtl=double, ceps=double, covestmethod="CROSSOP"|"HESSIAN"|"QML", ftol=double, gtol=double, iterationHistory={basic=true|false, estimatesForEachStep=true|false, olsEstimates=true|false}, maxf=double, maxit=double, maxtime=double, sing=double, sweepSing=double},
output={casOut={caslib="string", compress=true|false, indexVars={"variable-name-1", ...}, label="string", lifetime=64-bit-integer, maxMemSize=64-bit-integer, memoryFormat="DVR"|"INHERIT"|"STANDARD", name="table-name", promote=true|false, replace=true|false, replication=integer, tableRedistUpPolicy="DEFER"|"NOREDIST"|"REBALANCE", threadBlockSize=64-bit-integer, timeStamp="string", where={"string-1", ...}}, copyVars="ALL"|"ALL_MODEL"|"ALL_NUMERIC"|{"variable-name-1", ...}, pred="string", resid="string", te1="string", te2="string", xbeta="string"},
outputTables={groupByVarsRaw=true|false, includeAll=true|false, names={"string-1", ...}, repeated=true|false, replace=true|false},
restrictions={"string-1", "string-2", ...},
table={caslib="string", computedOnDemand=true|false, computedVars={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}}, computedVarsProgram="string", dataSourceOptions={key=any-list-or-data-type}, groupBy={{format="string", formattedLength=integer, label="string", name="variable-name", nfd=integer, nfl=integer}}, groupByMode="NOSORT"|"REDISTRIBUTE", importOptions={fileType="ANY"|...}, name="table-name", orderBy={{format="string", ...}}, singlePass=true|false, vars={{format="string", ...}}, where="where-expression", whereTable={...}},
tests={{eqns={"string-1", ...}, testLabel="string", testNames={"string-1", ...}}},
weight={name="variable-name", normalize=true|false};

Paramètres Clés

Nom du paramètre Description
table Désigne la table CAS d'entrée contenant les données de coûts et les facteurs explicatifs. Indispensable, sinon l'action n'a rien à se mettre sous la dent.
model Le cœur du réacteur : définit la variable dépendante (le coût), les effets (variables indépendantes comme les prix des intrants) et le type de distribution de l'inefficacité (EXPONENTIAL par défaut).
optimizer Permet de régler finement l'algorithme d'optimisation non-linéaire (par exemple Newton-Raphson) pour converger vers les estimations du maximum de vraisemblance.
output Spécifie les résultats à sauvegarder dans une nouvelle table CAS, notamment les prédictions et surtout les scores d'efficacité technique (te1, te2).
class Liste les variables catégorielles (comme les secteurs d'activité ou les régions) pour qu'elles soient traitées comme des facteurs dans le modèle.
bounds Permet de fixer des limites (min/max) sur les coefficients estimés pour éviter que le modèle ne raconte n'importe quoi mathématiquement.

Préparation des données

Simulation de données de coûts

Création d'une table CAS de test avec un coût dépendant de la production (q), du prix du travail (p) et d'un terme d'inefficacité stochastique.

1DATA mycas.costs; call streaminit(123); DO i=1 to 500; p_work = rand('uniform'); q_out = rand('normal', 100, 10); u_ineff = rand('exponential', 0.5); v_noise = rand('normal', 0, 0.1); cost = 5 + 0.8*q_out + 0.4*p_work + u_ineff + v_noise; OUTPUT; END; drop i u_ineff v_noise; RUN;

Exemples d'utilisation

Frontière de coût basique

Estimation d'un modèle simple avec inefficacité exponentielle sur nos données simulées.

1PROC CAS; frontier.frontierCost / TABLE={name='costs'}, model={depVars={{name='cost'}}, effects={{vars={'q_out', 'p_work'}}}, modelOptions={type='EXPONENTIAL'}}; RUN;
Résultat Attendu :
Un tableau des estimations de paramètres incluant l'intercept, les pentes pour q_out et p_work, ainsi que les variances SigmaSq et Gamma.
Analyse complète avec scoring d'efficacité

Estimation d'un modèle demi-normale (HALF) avec optimisation par Quasi-Newton et calcul de l'efficacité technique pour chaque observation.

1PROC CAS; frontier.frontierCost / TABLE={name='costs'}, model={depVars={{name='cost'}}, effects={{vars={'q_out', 'p_work'}}}, modelOptions={type='HALF'}}, optimizer={algorithm='QUASINEWTON', maxit=200}, OUTPUT={casOut={name='costs_scored', replace=true}, te1='eff_jondrow', pred='cost_pred'}; RUN; PROC CAS; TABLE.fetch / TABLE='costs_scored', maxRows=10; RUN;
Résultat Attendu :
La table 'costs_scored' est générée, contenant les données originales plus l'efficacité technique estimée (proche de 1 pour les plus efficaces) et le coût prédit.