domingo, 13 de maio de 2012

Tudo na linha....

Quando efectuamos experiências estatísticas podemos ter situações em que é o mesmo sujeito que é testado em diferentes situações ou não. Para cada uma das situações existem testes apropriados. No caso do SPSS cada linha de uma tabela corresponde aos diferentes resultados de um mesmo sujeito às diferentes condições. Isso implica que se tivermos sujeitos diferentes a testar as diferentes condições temos que colocar os resultados numa (longa ) coluna, acrescentado ainda uma segunda coluna de agrupamento. Nas experiências que fazemos, o que determina se estamos a fazer testes emparelhados ou não, é a natureza da população inicial em cada execução. Por exemplo, se estivermos a comparar o efeito de usar dois tipos diferentes de operadores de cruzamento e efectuarmos 30 execuções de cada condição, estaremos a efectuar testes emparelhados se em cada uma das 30 execuções as duas alternativas forem iniciadas com a mesma população. Acontece que, tipicamente, guardamos os resultados das diferentes execuções como se es testes fossem emparelhados. No caso de não serem temos a extenuante missão de passar tudo para uma coluna e introduzir a variável de agrupamento. Extenuante, a menos que tenhamos um programa que automatiza este processo.
def transform_file_spss(file_in, file_out):
    """From a file with matched values to a one without."""
    f_in = open(file_in)
    header_in = f_in.readline()
    body_in = f_in.readlines()
    f_in.close()
    
    split_header_in = header_in.split()
    number_col = len(split_header_in)
    number_lin = len(body_in)
    
    f_out = open(file_out,'w')
    header_out = 'Group\tValue\n'
    f_out.write(header_out)
    aux = [line[:-1].split() for line in body_in]
    # rearranje data
    body_out = []
    for i in range(number_col):
        # obtain column
        col = []
        for j in range(number_lin):
            col.append(aux[j][i])
        body_out.append(col)
    # write data
    for i in range(number_col):
        for j in range(number_lin):
            value = body_out[i][j]
            line_out = '%s\t%s\n' % (i,value)
            f_out.write(line_out)
    f_out.close() 
Nem mais!

Separações e outras complicações

Todos sabemos que os ficheiros existem sob diversos formatos. Os ficheiros de texto são muito simples e permitem guardar informação importante relativa à execução dos nossos algoritmos evolucionários. Os dados recolhidos são posteriormente tratados estatisticamente, sendo para isso necessário que o programa usado consiga importar correctamente o nosso ficheiro. Para tal temos que ter em atenção, entre outras coisas, dois aspectos: qual o símbolo usado para separar a parte inteira da parte decimal dos números e, qual o caracter separador dos diferentes valores. No que se refere ao SPSS (ou PASW) existe um comando que nos permite verificar qual o símbolo usado para separar as partes inteira e decimal (SHOW DECIMAL) e um modo de definir esse símbolo (SET DECIMAL {DOT, COMMA}). Basta abrir uma nova janela de sintaxe (File -> New -> Syntax), escrever e executar os comandos. Para facilitar a resolução da segunda questão podemos escrever um pequeno programa em Python que trata da questão.
def convert_file(file_in, sep_in,file_out,sep_out):
    """
    Change the separator of elements in a file.
    Assume ther existence of a header. Warning: the separator must be just that: a separator!
    """
    f_in = open(file_in)
    header_in = f_in.readline()
    body_in = f_in.readlines()
    f_in.close()
    
    f_out = open(file_out,'w')
    f_out.write(header_in)
    body_out = [line_in.replace(sep_in,sep_out) for line_in in body_in]
    f_out.writelines(body_out)
    f_out.close()
Simples, não é?