Ho difficoltà a creare un fattoriale in grado all'interno di uno script per assegnare determinati fattori DOE ad alcuni fattoriali.
Posso ottenere il primo livello con nchoosekMatrix() ma non riesco a capire come ottenere dinamicamente livelli superiori a 1.
Names default to here(1);
factorial_to_degree = function({factors, degree = 2, termlist = {}},
{DEFAULT LOCAL},
if(degree!=1,
termlist = recurse(factors, degree-1, termlist);
);
nckmat = nchoosekmatrix(nrows(factors), degree);
for(r = 1, r<=nrows(nckmat), r++,
AddTermExpr = Expr(AddTerm());
for(c=1, c<=ncols(nckmat), c++,
insert into(AddTermExpr, Evallist({factors[nckmat[r, c]], 1}));
);
insert into(termlist, nameexpr(AddTermExpr));
);
return(termlist);
);
factorial_to_degree([1, 2, 3], 2);
//returns
/*
{AddTerm( {1, 1} ), AddTerm( {2, 1} ), AddTerm( {3, 1} ), AddTerm( {1, 1}, {2, 1} ),
AddTerm( {1, 1}, {3, 1} ), AddTerm( {2, 1}, {3, 1} )}
*/
//want it to return
/*
{
AddTerm( {1, 1} ), AddTerm( {2, 1} ), AddTerm( {3, 1} ),
AddTerm( {1, 2} ), AddTerm( {2, 2} ), AddTerm( {3, 2} ),
AddTerm( {1, 1}, {2, 1} ), AddTerm( {1, 1}, {3, 1} ), AddTerm( {2, 1}, {3, 1} )
}
*/
Penso che dovrei fare qualcosa in modo ricorsivo, ma ho difficoltà a far funzionare qualcosa.
Qualsiasi aiuto sarebbe molto apprezzato.
Mi sono reso conto che le mie aspettative non erano giuste. In realtà ciò equivale a ciò che fa la macro del modello di adattamento.
Mi piace comunque il seguente approccio iterativo.
factorial_to_degree = function({factors, degree},
n_factors = nitems(factors);
factors = shape(factors, n_factors);
termlist = {};
for(i=1, i<=degree, i++,
nckmat = nchoosekmatrix(n_factors, i);
for(r = 1, r<=nrows(nckmat), r++,
AddTermExpr = Expr(AddTerm());
for(c=1, c<=ncols(nckmat), c++,
insert into(AddTermExpr, Evallist({factors[nckmat[r, c]], 1}));
);
insert into(termlist, nameexpr(AddTermExpr));
);
);
return(termlist);
);