Jim's suggestion to use a recursive partitioning method is great. The fact is, there is more than one way that you can model this ordinal reponse under different conditions of S, U, and D. Here is a result using ordinal logistic regression:
dt = New Table( "4x4x3 Factorial",
Add Rows( 48 ),
New Table Variable( "Design", "4x4x3 Factorial" ),
New Script(
"Model",
Fit Model(
Effects( :S, :U, :D, :S * :U, :S * :D, :U * :D ),
Y( :Y ),
PERSONALITY( Standard Least Squares )
)
),
New Script( "Evaluate Design", DOE( Evaluate Design, X( :S, :U, :D ) ) ),
New Script(
"DOE Dialog",
DOE(
Full Factorial Design,
{Add Response( Maximize, "Y", ., ., . ),
Add Factor( Categorical, {"1", "2", "3", "4"}, "S", 0 ),
Add Factor( Categorical, {"1", "2", "3", "4"}, "U", 0 ),
Add Factor( Categorical, {"1", "2", "3"}, "D", 0 ),
Set Random Seed( 873 ), Make Design, Simulate Responses( 0 ),
Set Run Order( Sort Left to Right ), Make Table}
)
),
New Script(
"Graph Builder",
Graph Builder(
Size( 566, 1456 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( Y( :Y ), Page( :D ), Group X( :U ), Group Y( :S ) ),
Elements( Points( Y, Legend( 7 ) ) ),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
7,
Properties( -1, {Line Color( 4 )}, Item ID( "1", 1 ) ),
Properties( -1, {Line Color( 41 )}, Item ID( "2", 1 ) ),
Properties( -1, {Line Color( 3 )}, Item ID( "3", 1 ) )
)}
)
)
)
),
New Column( "Pattern",
Character,
"Nominal",
Set Values(
{"111", "112", "113", "121", "122", "123", "131", "132", "133", "141",
"142", "143", "211", "212", "213", "221", "222", "223", "231", "232",
"233", "241", "242", "243", "311", "312", "313", "321", "322", "323",
"331", "332", "333", "341", "342", "343", "411", "412", "413", "421",
"422", "423", "431", "432", "433", "441", "442", "443"}
)
),
New Column( "S",
Character,
"Nominal",
Set Property( "Value Ordering", {"1", "2", "3", "4"} ),
Set Property( "Design Role", DesignRole( Categorical ) ),
Set Property( "Factor Changes", Easy ),
Set Values(
{"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "2", "2",
"2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "3", "3", "3", "3",
"3", "3", "3", "3", "3", "3", "3", "3", "4", "4", "4", "4", "4", "4",
"4", "4", "4", "4", "4", "4"}
)
),
New Column( "U",
Character,
"Nominal",
Set Property( "Value Ordering", {"1", "2", "3", "4"} ),
Set Property( "Design Role", DesignRole( Categorical ) ),
Set Property( "Factor Changes", Easy ),
Set Values(
{"1", "1", "1", "2", "2", "2", "3", "3", "3", "4", "4", "4", "1", "1",
"1", "2", "2", "2", "3", "3", "3", "4", "4", "4", "1", "1", "1", "2",
"2", "2", "3", "3", "3", "4", "4", "4", "1", "1", "1", "2", "2", "2",
"3", "3", "3", "4", "4", "4"}
)
),
New Column( "D",
Character,
"Nominal",
Set Property( "Value Ordering", {"1", "2", "3"} ),
Set Property( "Design Role", DesignRole( Categorical ) ),
Set Property( "Factor Changes", Easy ),
Set Values(
{"1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2",
"3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1",
"2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3",
"1", "2", "3", "1", "2", "3"}
)
),
New Column( "Y",
Numeric,
"Ordinal",
Format( "Best", 12 ),
Value Labels( {1 = "Low", 2 = "Med", 3 = "High"} ),
Use Value Labels( 1 ),
Set Values(
[1, 1, 2, 1, 1, 2, 1, 2, 3, 2, 3, 3, 1, 1, 2, 1, 1, 2, 1, 2, 3, 2, 3, 3,
1, 1, 2, 1, 2, 3, 2, 3, 3, 2, 3, 3, 1, 2, 3, 2, 3, 3, 2, 3, 3, 2, 3, 3]
)
),
Set Label Columns( :Pattern )
);
dt << Fit Model(
Y( :Y ),
Effects( :S, :U, :D ),
Personality( "Ordinal Logistic" ),
Run(
Likelihood Ratio Tests( 1 ),
Profiler(
1,
Term Value(
S( "1", Lock( 0 ), Show( 1 ) ),
U( "1", Lock( 0 ), Show( 1 ) ),
D( "1", Lock( 0 ), Show( 1 ) )
)
)
)
);