BookmarkSubscribeRSS Feed
Choose Language Hide Translation Bar
vince_faller
Super User

factorial to degree script

I'm having a hard time making factorial to degree inside of a script in order to assign certain DOE factors to some factorial.  

I can get the first level with nchoosekMatrix() but can't figure out how to dynamically get levels higher than 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} )
}
*/

 

 

I think I should be doing something recursively but I'm having a hard time actually getting anything to work.  

Any help would greatly be appreciated.  

0 Kudos
1 ACCEPTED SOLUTION

Accepted Solutions
Highlighted
vince_faller
Super User

Re: factorial to degree script

I realized that my expectations were not right.  This actually does the same thing as what fit model macro does.  

 

I like the following iterative approach more though.  

 

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);
);
1 REPLY 1
Highlighted
vince_faller
Super User

Re: factorial to degree script

I realized that my expectations were not right.  This actually does the same thing as what fit model macro does.  

 

I like the following iterative approach more though.  

 

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);
);