'Factor is initialized with keys, representing all valid
levels of the factor.
If ordinal is False, keys can have repeats: set(keys) is what is
used.
If ordinal is True, the order is taken from the keys, and
there should be no repeats.'

def __init__(self, termname, keys, ordinal=False):

    if (not ordinal):
        self.keys = list(set(keys))
        self.keys.sort()
    else:
        self.keys = keys
        if (len(set(keys)) != len(list(keys))):
            raise ValueError('keys    for    ordinal    Factor    should    be    unique,    in    increasing    order')
    self._name = termname
    self.termname = termname
    self.ordinal = ordinal
    if self.ordinal:
        name = self.termname
    else:
        name = [('(%s==%s)' % (self.termname, str(key))) for key in self.keys]
    Term.__init__(self, name, termname=self.termname, func=self.get_columns)
