I am new to q and have some issue in understanding the below code
.quantQ.stats.kendallTauRank:{[xS;yS]
//xS,yS – arrays of values to compare the rank
// aggregate concordance statictics
stats: sum raze {.quantQ.stats.concordanceRoutine/:[y;(1+x?y)_x]}[t] each t: flip(xS,yS);
// return kendall’s tau rank
:(stats[0]-stats[1])%0.5*count[xS]*count[xS]-1;
}
.quantQ.stats.concordanceRoutine return a tuple like 100b, 010b
my understanding is t is like (num1,num2) if so, what is the each right operation doing? in particular the x,y should be numeric value then how should i read the staff inside [y;(1+x?y)_x] based on the drop, it seems like x,y are still vector
.quantQ.stats.kendallTauRank:{[xS;yS] //xS,yS -- arrays of values to compare the rank // aggregate concordance statictics stats: sum raze {.quantQ.stats.concordanceRoutine/:[y;(1+x?y)_x]}[t] each t: flip(xS,yS); // return kendall's tau rank :(stats[0]-stats[1])%0.5*count[xS]*count[xS]-1; }
flip(xS,yS) tells us that xS and yS must be same-width matrices otherwise there would be nothing to flip.
The binary lambda {.quantQ.stats.concordanceRoutine/:[y;(1+x?y)_x]} is projected on t, which thus becomes the y in the lambda.
The lambda could equally be written {y .quantQ.stats.concordanceRoutine/:(1+x?y)_x} from which it might be clearer how, with x set to t, the binary concordance routine is being iterated: each row of t against the rows that follow it.
Two ways to express the same iteration:
raze{.quantQ.stats.concordanceRoutine/:[y;(1+x?y)_x]}[t] each t t .quantQ.stats.concordanceRoutine'(1+til count t)_\: t
Line 6 defines the result. Omitting the explicit Return : and the trailing semicolon would be better style. stats would be three integers; the difference could also be written -/[2#stats].