De procedure Transform_l moest overal worden opgenomen
waar de alpa parameters werden veranderd.
Dat was niet gebeurd, geloof ik, in S_mcmc_I en S_ML.
Het is mogelijk dat dat tot fouten heeft geleid.

IK heb nu Transform_l, samen met andere procedures voor
tussen-berekeningen, in SetAlpha (de vroegere GetParameter,
dit is een duidelijker naam) opgenomen, om dergelijke fouten
voortaan te vermijden.


Andere statistic bij betweenness (volgens de algemene formules).

Bij dense triads de eerste x_{ij} toegevoegd in
 $s^{\rm net}_{i\vit}(x) =  \sum_{j,h} x_{ij} \, I\{ x_{ij}\, + x_{ji}\, + x_{ih}\, + x_{hi}\,
 + x_{jh}\, + x_{hj}\,)\geq c \}\,$,\\
en bij de statisticis de algemene formule gebruikt.

Andere behandeling van missings bij statistics voor
balance (alleen gesommeerd over h waarvoor ih en jh
op beide tijdstippen niet-missing zijn);
covariate ego (uitsluiten missing alters niet overgenomen);
covariate alter (uitsluiten missing egos niet overgenomen);


Nog extra effect: directe en indirecte verbindingen

  \sum_j x_{ij} max_{h \neq j} x_{ih}x_{hj}

dit is verwant aan het aparte endowment effect van indirecte relaties
dat in eerdere versies van SIena apart was gedefinieerd.

Ik heb in deze versie ook alles wat in Utilitygain en UtilityPlusGratificationGain
gebeurt proberen op te nemen in de nieuwe versie.
Voor zover ik kan zien, werd in de door mij gebruikte Siena versie
(behalve in SimulateData) geen waarde aan actorRE toegekend.
Daardoor kan ik niet doorzien wat het meest efficient is.

actorRE en changestat wordt nu gebruikt in ChooseTieVariable in S_Base.
Ik meen dat dit hetzelfde doet als in de vroegere versie
in Utilitygain en UtilityPlusGratificationGain.
Bij het gebruik van alternative lijkt het mij logischer dat
deze waarde ook voor yn(i,j) = false wordt gebruikt.
Dat heb ik in het onderstaande fragment gedaan, maar kan eenvoudig
worden veranderd.
Toetsen van andere coordinaten op outliers is in deze vorm heel eenvoudig.
De functie addgain is nu overbodig geworden.

Michael, controleer svp de volgende statements in ChooseTieVariable:

  if (randomeffects or d_est or (homogeneous in [11..19])) then begin
    SetLength(alf,NetworkEffects_f);
    for j:=1 to NetworkEffects_f do begin
      alf[j-1] := alpa_f[j];
      if randomeffects then begin
        k := res[1,j];
        if (k <> 0) then alf[j-1] := alf[j-1] + actorRE[i,k];
       end;
     end; (* for  j *)
    if ((homogeneous in [11..19]) and
        ((derivatives and (alternative <> 999999999)) or altern) and outlier[i])
      then begin
        if (homogeneous = 11) then alf[0] := alternative;
        if (homogeneous = 12) then alf[1] := alternative;
       end;
    AddNoTies_yn(i,thisperiod,prup,alf,permitted,changestat,NewNetworkEffects);
    for j:=1 to NetworkEffects_f do begin
      k := res[2,j];
(* The following assignment statement retains the alternative values in alf
   in case of homogeneity tests;
    this differs from Siena 2; Michael, if not OK, please change this back again. *)
      if (k <> 0) then alf[j-1] := alf[j-1] - alpa_g[j] - actorRE[i,k]
        else alf[j-1] := alf[j-1] - alpa_g[j];
     end;
    SubtractTies_yn(i,thisperiod,prup,alf,permitted,changestat,NewNetworkEffects);
   end ....

Hierbij horen ook de assigment statements
    chas[2,Ef.index+1,j] := -sum;
    chas[3,Ef.index+1,j] := sum;
in Contrib_n_alpha in Digraph en
    chas[2,Ef.index+1,j] := sum;
in Contrib_fn_alpha in Digraph.
In vergelijking met Siena 2 worden hierdoor de elementen van
changestat[2,h,j] en changestat[3,h,j] veranderd voor alle h waarvoor
(Effects_f[h] or Effects_g[h]) geldt; dat is meer dan nodig,
maar ik neem aan dat dat niet geeft, en de code wordt
onoverzichtelijker als een aanpassing zou worden gemaakt
om changestat[2,h,j] alleen te veranderen indien Effects_f[h]
en changestat[3,h,j] alleen indien Effects_g[h].


In function MLModel.EvaluateMultinomial in S_MCMC_I heb ik een soortgelijke
code aangebracht als in ChooseTieVariable.
Michael, zou je die ook willen controleren?

Het lijkt me beter dat de array actorRE gedefinieerd wordt in
type ModelSpecification of type DataSpecification dan als een globale
variabele in S_Base. Michael, zou je dit willen veranderen?


Ik vind het ongewenst dat S_Matrices naar Eight verwijst.
De procedure ReadDigraph heb ik daarom met een aanpassing naar Eight verhuisd.

Ter bestrijding van circulariteitsproblemen bij de onderlinge verwijzing van units
heb ik de unit S_Constants gecreeerd.


versie 3bet3.

Ik heb toegevoged in S_DAt:

   ReciprocityModel: Boolean;
   (* This indicates that the rate function is defined as in the reciprocity model
      by equations (25), (30) in Snijders & van Duijn 1997. *)
   DifferenceDerivatives: Boolean;
   (* Indicates that the Jacobian in S_Est is computed with the difference method;
      if false, by the score method . *)

DifferenceDerivatives wordt in S_Est gebruikt volgens
Initialise_d_est(lf,3,n3,pp,DifferenceDerivatives);

In ReviseDefinition wordt nu DifferenceDerivatives op true gezet.
Dat moet veranderen, hij moet uit de .mo files worden gehaald.

ModelType 6 in de .mo file wordt nu geinterpreteerd als de wens
om het ReciprocityModel te gebruiken.
Bij een netwerk-alleen model met alleen effecten van outdegree,
reciprocity, en covariaten (mag ook met endowment)
wordt dan het reciprocity model verkregen, door een veranderde rate functie.


Voor de endowmentfunction is in 3bet3 het volgende veranderd t.o.v. 3bet2:

In de statistic is het minteken uit Snijders Steglich Schweinberger (2005)
formule (30) in NewStatistics gezet;
dat stond in 3bet2 als een minteken in  DefineTotalContributions in Digraph
en in de aanroep van SubtractTies_yn in S_Base (zoek in deze files op 3bet2),
maar dat was niet natuurlijk en leidde tot het verkeerde teken n de
geschatte parameter;
N.B. bij de uitvoer in S_Est is voor het rapporteren van de target statistics
het minteken weer omgekeerd. Zo klopt de naam bij de gerapporteerde waarde.


Versie 3bet5:
============
De rol van bovengenoemde boolean DifferenceDerivatives
heb ik laten overnemen door de bestaande d_est,
waarvan de waarde nu in S_Dat en S_Sim wordt vastgesteld.
De bepaling in S_Dat is nu   d_est := false;
moet tzt worden veranderd door een uit de .mo file ingelezen code.

Dit heb ik later weer teruggedraaid. Hopelijk geen verwarring gezaaid.

Checkfile heeft nu extensie .cck, want Windows geeft andere interpretatie
aan .chk files (recovered file fragments of zo).


Michael: Ik heb veranderd in S_ML.Scores. 

De mededelingen gegeven door S_RE.Checkfiles kloppen niet 
indien (maxlike and (not randomeffects)).

In S_mcmc een aantal condities voor open files toegevoegd (zie "TS").

In S_phase3.Initialise_d_est heb ik ook de tweede helft
onder de voorwaarde "not(maxlike or Bayesian or (observations = 1))" gezet
(want dan worden helemaal geen partial derivatives geschat).

(Opmerkingen vanaf hier: doorgewerkt met Siena_16_December_2005_MS).

Staysametype = 1 als veranderingen noodzakelijk zijn,
2 als niet veranderen (dus "i = j") toegestaan is.
Dit zit volgens mij goed in S_ML.

AddNoTies_yn en SubtractTies_yn worden beide gebruikt in S_Base.ChoiceProbabilities
en in S_mcmc_I.EvaluateMultinomial.
Zij zijn gedefinieerd in Eight en roepen AddNoTies en SubtractTies aan.
Deze zijn gedefinieerd in Digraph.

contrib_fn_alpha(i,j) = \sum_h \alpha_h \{ s_{ih}(x(ij+)) - s_{ih}(x(ij-))\}
where x(ij+) is the current network, but with x_{ij} = 1,
while x(ij-) is the current network, for which holds x_{ij} = 0
(in other words, \{ s_{ih}(x(ij+)) - s_{ih}(x(ij-))\} is the 'change statistic');
the summation is only over effects s_{ij} in the evaluation function.

contrib_n_alpha(i,j) = \sum_h \alpha_h \{ s_{ih}(x(ij-)) - s_{ih}(x(ij+))\}
where x(ij+) is the current network, for which holds x_{ij} = 1,
while x(ij-) is the current network, but with x_{ij} = 0;
the summation is over effects s_{ij} in the evaluation function and in the
endowment function.

AddNoTies(i,p,perm) changes p[j] to p[j] + contrib_fn_alpha(i,j)
for all j satisfying x_{ij} = 0, perm[j] = true;
SubtractTies(i,p,perm) changes p[j] to p[j] - contrib_n_alpha(i,j)
for all j satisfying x_{ij} = 1, perm[j] = true.
These two procedures are always used together, after assigning values 0
to all p[j]; after that, p[j] must be transformed to exp(p[j])
and set to 0 for j with (perm[j] = false).

Ik denk dat het volgende stukje code (voor SubtractTies) in S_mcmc_I.EvaluateMultinomial

  for j:=1 to NetworkEffects_f do begin
    alf[j-1] := alf[j-1] - alpa_g[j];
(* This retains the alternative values in case of homogeneity tests;
    this differs from Siena 2; Michael, if not OK, please change this back again. *)
    if randomeffects then begin
     k := res[2,j];
     if (k <> 0) then alf[j-1] := alf[j-1] - actorRE[ego,k];
    end; (* if *)
   end; (* for j *)

moet worden vervangen door (-/+ tekens:)

  for j:=1 to NetworkEffects_f do begin
    alf[j-1] := alf[j-1] + alpa_g[j];
(* This retains the alternative values in case of homogeneity tests;
    this differs from Siena 2; Michael, if not OK, please change this back again. *)
    if randomeffects then begin
     k := res[2,j];
     if (k <> 0) then alf[j-1] := alf[j-1] + actorRE[ego,k];
    end; (* if *)
   end; (* for j *)

In S_Base.ChoiceProbabilities had ik eerst een soortgelijke fout
die ik wel heb hersteld; dat is tot nu toe nagelaten in S_mcmc_I.EvaluateMultinomial.



In S_mcmc en S_mcmcI heb ik enkele kleine veranderingen aangebracht voor de consistentie.
Verder heb ik UpdateLProbs verplaatst van S_RE naar S_mcmcI, 
omdat hij van de arrays lprob (vroeger lprobs), prob1, en prob2 
gebruik maakt, die nu geen arrays meer zijn 
maar onderdelen van de Ministeps in Chain (zie unit Chains).

De array presentdensities werd in S_ML geinitialiseerd met lengte Available.
Ik geloof dat dit een vergissing was, en dat de initialisatie op n+1 moest zijn,
want als ik het goed heb gezien werd deze array gebruikt voor actor random effects.

variabele nrunMH gedeclareerd in S_dat i.p.v. S_ML.Scores.

Michael, controleer voor Bayesian of nrunMH de gewenste waarde krijgt in S_Dat.
(Is nu afhankelijk van rstep, lijkt me logisch.)

Continuous wordt voor maxlike en Bayesian in S_dat op true gezet,
en zorgt in Polrup voor de burnin. 

Ik heb veel van de procedures voor Bayesian/Random effects tussen haakjes gezet
omdat ik niet overzie hoe Michael deze wil aanpassen aan meerdere periodes.
Het was syntactisch nog goed voor unit CHain tot het moment dat ik overging
van 1 Tchain naar een array of Tchain.

In S_Est bij Scoretest heb ik voorlopig de voorwaarde "if not maxlike" toegevoegd.

In initialise_y(k) heb ik "thisperiod := k" opgenomen. Dat lijkt me logisch.
Ook heb ik daar de ya afgekapt tussen zcmin en zcmax (ging niet vanzelf voor missende waarden).

Toegevoegd functies minimalya en maximalya aan S_Dat.

Michael, je laat in S_phase3 heel veel functies steeds opnieuw uitrekenen,
bv. NumberRateParameters. Dat lijkt me nodeloos tijd kosten.
Ik had een andere oplossing:
Bv: ActiveNetworkEffects_l is een variabele die een keer wordt uitgerekend
(in InitialiseBase) en dan steeds gebruikt.

Michael, zou je d_est en d_estimator zo willen gebruiken dat de in de .mo file
gebruikte waarde gehandhaafd blijft?
Ik heb de overriding assignment statement d_est := true
(of was het d_estimator := 2; of allebei) weggehaald, dat was misschien
onverstandig want later zag ik dat het in Initialise_d_est
wordt ingesteld zonder op de .mo file te letten.
Mijn voorstel: gebruik de variabele d_estimator om de specificatie
in de .mo file te onthouden, en verander tijdens het programma d_est
op grond van d_estimator en andere onderdelen van de specificatie. 


In alle gevallen (dwz met en zonder afhankelijke gedragsvariabelen)
vind ik het beter om voor veranderlijke variabelen (endogeen en exogeen)
bij netwerk-statistics de gedragsvariabelen van het begin
van de periode te gebruiken, en bij gedrags-statistics de netwerkvariabelen
van het begin van de periode.
Dat zijn immers de waarden geweest die invloed hebben uitgeoefend.

Ik denk dat het onderscheid tussen de arrays Active en Structactive overbodig is.
Die moeten we maar eens met elkaar identificeren.

Wat mij betreft gaan we bij likelihood-based inference nooit changing
composition toelaten; wel structurally determined values
(zit er nu al in). 

Michael: haal jij initialise_y_likel weer weg?

Christian: ik neem aan dat alle geimputeerde waarden voor missings al in
de interne Siena datafiles staan?


Ik heb de parametervolgorde veranderd: het staat voor in S_Dat vermeld:

(* Order of statistic types is as follows.
   this order will eventually supersede the arrays "contribution".
   (observations - 1)                    for network base rate of change;
   networkeffects_f                      for network evaluation;
   networkeffects_f                      for network endowment;
   networkeffects_l - (observations - 1) for network change, in addition to base rates;
   nza*(observations - 1)                for action base rate of change;
   nza*actioneffects_f                   for action evaluation;
   nza*actioneffects_f                   for action endowment;
   nza*(actioneffects_l - (observations - 1)) for action change,
                                              in addition to base rates.
   Correspondence between order of effects in parameter estimation
   and order of effect types in model definition is determined in
   procedures SetTheta and SetAlpha in S_Base.
   For parameters in theta, the order is:
   first ActiveNetworkEffects_l network rate effects;

Voor grotere bestandheid tegen diverse compiler opties
heb ik veel strings door shortstrings vervangen.

Result is een gereserveerd woord.
In S_matrices heb ik result door reslt vervangen.
Het is overbodig om deze variabele (result/reslt) in deze unit te declareren.
Dat heb ik daarom weggelaten. 
   then ActiveNetworkEffects_f  network evaluation effects;
   then ActiveNetworkEffects_g  network endowment effects;
   then ActiveActionEffects_l   action  rate effects;
   then ActiveActionEffects_f   action  evaluation effects;
   then the action endowment effects. *)

   Moet nog doorgewerkt voor MoM.
   Ook voor het switchen tussen conditional en unconditional estimation.

   Structureel inactieven: voor afhankelijke gedragsvariabelen
   een missing waarde gebruiken tenzij de waarde echt bekend is.


Aan S_Start heb ik de procedure ChangeModel toegevoegd, om meerdere files
in batch met dezelfde gewijzigde .mo file op te starten.

De logaritmische parametrisering voor de constante rate parameter
is numeriek instabiel. Ik heb het weer teruggezet!!! Nog onvolledig...
Ik heb in SetAlpha een positiviteitsrestrictie opgenomen.

versie 3bet9

In S_Start heb ik voor nzx=4 de optie gemaakt (procedure ConvertExoToStruct)
om compositieveranderingen te veranderen in structurele nullen.

In Digraph.UtilityComponents heb ik in AddCo_f en SubtractCo
een interne kladvariabele coo gemaakt om de paramter co
slechts een keer aan te roepen. Ondanks de const definitie van de parameter
maakt dat enkele procenten rekentijd uit.
Moraal: argumenten die rekentijd vragen maar 1 keer uitrekenen!

In het ERGM geval heb ik de inversion step afgeschaft.

Michael: ik begrijp niet dat er in Siena_7 drie series "with ContinueDigraph do"
staan. Kan je voor observations = 1 en voor (vermoed ik) MoM
er if-statements bij zetten zodat er maar een serie overblijft?

Ik heb readdefinition gesplitst in
readdefinition1: sectie 1
hiertussen moet readpdata, om symmetrie e.d. te kunnen detecteren;
readdefinition2: NewnetworkEFfects.create, daarna de andere secties.

Michael: in Siena_7 moet readdefinition niet in een
"while (run < sequences) do" loop staan.
(Het gaat nu nog om readdefinition2).



{
   if symmetric
   then modelnames[8] := '3-stars'
   else modelnames[8] := 'out-3-stars';
   modelnames[9] := 'in-3-stars';
   if symmetric
   then modelnames[10] := '4-stars'
   else modelnames[10] := 'out-4-stars';
   modelnames[11] := 'in-4-stars';

   if symmetric
   then begin
     Param[12] := 1;
     modelnames[12] := 'sum 1/(degrees + '+st(param_effect[12])+')';
     VertPar[12] := true;
     Param[13] := 1;
     modelnames[13] := 'sum 1/(degrees + '+st(param_effect[13])+')(degree + '+st(param_effect[13]+1)+')';
     VertPar[13] := true;
     modelnames[14] := '# pairs direct + indir. connected';
     modelnames[15] := '# pairs indirectly connected';
     Param[16] := 2;
     modelnames[16] := 'alternating k-stars, parameter '+st(param_effect[16]);
     VertPar[16] := true;
     Param[17] := 2;
     modelnames[17] := 'alternating k-stars, parameter '+st(param_effect[17]);
     VertPar[17] := true;
   end
   else begin (* not symmetric *)
     Param[12] := 1;
     modelnames[12] := 'sum 1/(outdegrees + '+st(param_effect[12])+')';
     VertPar[12] := true;
     Param[13] := 1;
     modelnames[13] := 'sum 1/(o.deg. + '+st(param_effect[13])+')(o.deg. + '+st(param_effect[13]+1)+')';
     VertPar[13] := true;
     modelnames[14] := '# ord. pairs direct + ind. connectd';
     modelnames[15] := '# ordered pairs indirectly connectd';
     Param[16] := 2;
     modelnames[16] := 'alternating out-k-stars, parameter '+st(param_effect[16]);
     VertPar[16] := true;
     Param[17] := 2;
     modelnames[17] := 'alternating in-k-stars,  parameter '+st(param_effect[17]);
     VertPar[17] := true;
   end; (* if-then-else according to symmetric property *)
   Param[18] := 2;
   modelnames[18] := 'alternating k-triangles, parameter '+st(param_effect[18]);
   Param[19] := 2;
   modelnames[19] := 'alternating independent 2-paths, par. '+st(param_effect[19]);
   count := 19;
   for i:=1 to nzz do modelnames[count+i] := ZZNames[i]+' (centered)';
   for i:=1 to nz+nzc do
   begin
     modelnames[count-2+nzz+3*i] := ZNames[i]+' popularity';
     modelnames[count-1+nzz+3*i] := ZNames[i]+' activity';
     modelnames[count  +nzz+3*i] := ZNames[i]+' similarity (centered)' ;
   end;
   for i:=1 to nzz
   do modelnames[count+nzz+3*(nz+nzc)+i] := ZZNames[i]+' (centrd) * reciprocity';

   (* now the correspondence calculation: *)
   for i:= NetworkEffects_f downto 1 do Correspondence[i] := i;
}


=============

Ik heb de procedures Crudemethod1 en crudemethod3 in elkaar geschoven,
en de "crude method" namen veranderd in "finite differences" namen,
die meer specifiek zijn.

Het is efficienter om de LR methode ook in fase 1 te gebruiken.
Dat heb ik gedaan door override_default in initialise_d_est ook in fase 1
aanvankelijk op "false" te zetten.
Als er bij JacobianMatrix een waarschuwing wordt gegeven,
dan levert deze methode een singuliere Jacobiaan
(dat ben ik bij kleinere datasets meerdere keren tegengekomen)
en wordt fase 1overgedaan met override_default = true.

De include file S_Phase3 heeft zo wel een verkeerde naam.

Bij de LR methode voor het schatten van afgeleiden worden arrays
d_store, u_store en s_store gebruikt van zeer hoge dimensie.
Dat is ongewenst. Zeker bij modellen met grote aantallen parameters
doet dit een te groot beroep op geheugencapaciteit.
Van deze matrices worden, denk ik, in feite alleen de sommen,
kwadratensommen, en kruisproductensommen gebruikt ("sommen" over iteraties).
Er kan dan volstaan worden met veel kleinere matrices.

Voor de helderheid heb ik "D_est := false" aan het eind van Jacobianmatrix naar Polrup verplaatst.

Het gebruik van de array mp is inefficient; deze exponenten worden ook
in RunStep uitgerekend.

===========================
2-1-07

De berekening van de action effects is veranderd, en gebeurt nu
veel efficienter. Zie
S_Base.Contr_fa
Eight.CalcComponents_fa
Ik zou het nog graag eens met objecten doen analoog
aan de netwerk-effecten.

De constante nmax is verdwenen en alle van n afhankelijke arrays
zijn nu met dynamische grenzen gedefinieerd.
(Bedenk bij het gebruiken van arrays met dynamische grenzen
als parameters in procedures, dat Delphi dan
in die procedures altijd de ondergrens 0 gebruikt.
Dit betekent dat het onverstandig is om hier
arrays als actuele parameter te gebruiken die zijn
gedefinieerd met een andere ondergrens.)




Michael: in Siena_7 regel 162 heb ik InitialiseBase toegevoegd
vanwege het definieren van array sizes afhankelijk van n.
Controleer svp of dat niet interfereert met de reden waarom jij hier
een aparte keer het model activeert.

Ik heb een nieuwe versie d_estimator=3 van de LR methode toegevoegd.
De oude d_est is gesplitst in d_estA, d_estB, d_estAB
volgens de volgende regels (staat in S_Dat):
                      d_estA = (d_est and (d_estimator in [1..2])),
                      d_estB = (d_est and (d_estimator = 4)),
                      d_estAB = d_estA or d_estB;
                      since d_estimator = 4 is a new option,
                      the old d_est is functionally equivalent to the new d_estAB
                      as well as to the new d_estA. 
cdscore heeft een tweede dimensie gekregen die met thisperiod overeenkomt.
de oude cdscore[i] = sum_{h=1}^{observations-1} (nieuwe cdscore[i,h])
Voor het berekenen van cdscore is de conditie d_est vervangen door d_estAB.
Voor het verwerken van de resultaten van cdscore
is de conditie d_est gedifferentieerd tussen d_estA en d_estB.
Hierbij worden de lange arrays d_store, s_store, u_store,
niet meer aangemaakt voor d_estB, omdat ze alleen nodig zijn voor d_estimator=2.
In plaats hiervan worden kleinere arrays d_sum, s_sum gebruikt.

De naam Estimate_D heb ik vervangen door StoreScore,
wat ik een duidelijker naam vind.

In D_Estimate = StoreScore wordt de naam d_store gebruikt als parameter
terwijl het ook een globale variabele in S_Base is.
Dat is gevaarlijk, maar ik heb het nu zo gelaten.
Het is mij niet duidelijk waarom d_store in deze procedure als parameter wordt gebruikt,
en s_store niet.

 


 symmetric.

 tie-based: S_Base 4385  utilitygain

        1: ModelTypeString := 'Forcing model';
        2: ModelTypeString := 'Unilateral initiative and reciprocal confirmation';
        3: ModelTypeString := 'Tie-based model';
        4: ModelTypeString := 'Pairwise conjunctive model';
        5: ModelTypeString := 'Pairwise disjunctive model';
        6: ModelTypeString := 'Pairwise compensatory model';
 
