Traduções desta página:

Ferramentas do usuário

Ferramentas do site


05_curso_antigo:r2017:alunos:trabalho_final:marcelusgualax:funcao_scacorum

Funções scacorum

#####Código das três funções scacorum#####

#A continuação vamos a apresentar o código das três funções scacorum (scacorum.sim, scacorum.calc e scacorum.graf)

#Começamos pela primeira função, scacorum.sim para fazer as simulações
scacorum.sim=function(t,m,source)
  
  
{
  #Temos colocado um limite de 100 simulações (t) e 1000 movimentos, para que os cálculos sejam relativamente rápidos, e também para criar uma saída gráfica bonita com scacorum.graf
  #porem, sempre podem se trocar esses limites modificando o seguinte objeto
  t.limite=100
  #O número t deve ser um número inteiro entre 1 e t.limite
  if(is.element(t,c(1:t.limite))==FALSE ) 
   #se não for assim para a função e envia uma mensagem de erro 
  {
    stop(paste("t deve ser um numero inteiro entre 1 e ", t.limite))
    
  }
  #A mesma coisa para o número de movimentos (m)
  #criamos o limite em 1000
  m.limite=1000
  #...m deve ser um numero inteiro entre 1 e o limite
  if(is.element(m,c(1:m.limite))==FALSE )  
   #Se não para a função e envia uma mensagem de erro 
  {
    stop(paste("m deve ser um numero inteiro de 1 até ", m.limite))
    
  }
  
  #Se falta o argumento source procede a simulará tanto as trajetórias do rei quanto as do cavalo, que é o seguinte que vamos programar
  if(missing(source))
    
  {
    
 #Agora vamos carregar os movimentos primários:   
    
    #Primeiro os 8 movimentos primários do rei, 
    #o vetor da x
    mov.prim.x.rei=c( 0, 1, 1, 1, 0, -1,-1,-1)
    #e o vetor da y
    mov.prim.y.rei=c(-1,-1,	0, 1, 1, 1, 0,-1)
    #E juntados numa matriz, lembremos que os movimentos primários são direções, cada uma das 8 filas nos indica se o rei vai subir, permanecer ou descer (x), 
    #e se vai para a esquerda, fica no centro, ou vai para a direita (Y)
    movimentos.prim.rei=as.matrix(cbind(mov.prim.x.rei,mov.prim.y.rei))
    
    
    #Agora o cavalo, primeiro o vetor da x
    mov.prim.x.cav=c(1, 2, 2,	1, -1, -2, -2, -1)
    #depois o vetor da y
    mov.prim.y.cav=c(-2, -1, 1,	2, 2,	1, -1, -2)
    #... juntados numa matriz
    movimentos.prim.cav=as.matrix(cbind(mov.prim.x.cav,mov.prim.y.cav))
    
    
    
 #Agora criamos uma matriz cheia de NA, onde colocaremos t vetores de tamanho m
    
    ordem.mov.sim=matrix(NA, ncol=t, nrow=m)
   for(i in 1:t)
    {
      
     
       #A cada ciclo criamos um vetor com o comprimento do numero de movimentos (m), enchido aleatoriamente com números do 1 ao 8, cada número representa um movimento primário. 
      #Esse será o vetor que direcione tanto a trajetória do rei, quanto a do cavalo. O número de movimentos e m-1 porque vamos considerar o primeiro movimento o estado inicial (0,0), que será colocado mais na frente
      ordem.mov=sample(c(1:length(mov.prim.x.rei)),m-1, replace=T)
     #Colocamos o primeiro vetor na segunda posição da matriz (deixamos reservado espaço para o movimento inicial)
       ordem.mov.sim[2:m,i]=ordem.mov
      
    }
    
    
    #Agora vamos a criar as trajetórias do rei e do cavalo, traduzindo os números (1 ao 8) nos movimentos primários de cada peça
    
    #Começamos pela trajetória do rei
    #O seguinte vetor traduz cada número de movimento primário ao correspondente movimento de x
    rei.mov.x=matrix(movimentos.prim.rei[ordem.mov.sim,1], nrow=m)
    #A mesma coisa com a y
    rei.mov.y=matrix(movimentos.prim.rei[ordem.mov.sim,2], nrow=m)
    
    #Agora vamos colocar o ponto inicial (0,0) em todas as trajetórias
    #Um 0 na primeira posição da x 
    rei.mov.x[1,]=rep(0,t)
    #Outro 0 na primeira posição da y
    rei.mov.y[1,]=rep(0,t)  
    
     #Para obter as coordenadas temos que somar os movimentos da x e da y.
    #somamos acumulativamente as x
    rei.x=apply(rei.mov.x,2,FUN = cumsum)
    #somamos acumulativamente as y
    rei.y=apply(rei.mov.y,2,FUN = cumsum)
    
   
    
     #Agora faremos o mesmo processo com o cavalo
    #Traduzimos cada número de movimento primário ao correspondente movimento de x e y
    #Tradução da x
    cav.mov.x=matrix(movimentos.prim.cav[ordem.mov.sim,1], nrow=m)
    #Tradução da y
    cav.mov.y=matrix(movimentos.prim.cav[ordem.mov.sim,2], nrow=m)
    
    #Colocamos o ponto inicial da x
    cav.mov.x[1,]=rep(0,t)
    #Colocamos o ponto inicial da y
    cav.mov.y[1,]=rep(0,t)  
    
    #E obtemos as coordenadas da x e da y.
    #somando acumuladamente as x
    cav.x=apply(cav.mov.x,2,FUN = cumsum)
    #e somando acumuladamente as y
    cav.y=apply(cav.mov.y,2,FUN = cumsum)
    
    #Agora temos que calcular as medidas espaciais, é importante ressaltar que as medidas devem poder ser extraídas com qualquer quantidade de movimentos
    
   ###Vamos começar a programar todas as medidas do rei e depois procederemos igual com o cavalo
    
    #Para calcular o número de escaques repetidos, o primeiro vamos fazer um vetor para reconhecer cada escaque, juntando x e y num único elemento
    ponto.nick.rei=matrix(paste0(rei.x,"/",rei.y),nrow=m)
    
    #Agora, faremos um vetor que indique, a cada movimento, quantas vezes o escaque presente foi ocupado até esse momento da trajetória.
    #Utilizamos a função ave, que divide um conjunto de dados segundo as categorias de outros conjuntos de dados, e calcula alguma operação matemática no conjunto de dados resultado dessa divisão amostral
    #primeiro criamos uma matriz do tamanho das nossas simulações (t*m) cheia de "1", esse é o conjunto de dados que a função ave vai dividir e aplicar a operação
    #E vamos dividir em subconjuntos com respeito a duas condições: 
    #1)"ponto.nick.rei", ou seja fará subconjuntos com os escaques com mesmo "nick"
    #2)matrix(rep(1:t,each=m), essa matriz ajuda a diferenciar de uma trajetória simulada para outra, tem um 1 em todos os movimentos da primeira trajetória, um 2 em todos os movimentos da segunda, etc...
    #Assim, a primeira matriz (cheia de "1") é dividida por nick, e por trajetória, e realizamos um cumsum. Ou seja obtemos o acumulado de "1" (primeira matriz), que cumpra as duas condições de agrupação indicadas
    #O resultado é interessante, como falado, nos indica  em cada simulação (coluna), e em cada movimento (linha) quantas vezes foi ocupada o escaque presente até esse movimento da trajetória.
    
    rep.eachmov.rei=ave(matrix(1,nrow = m, ncol=t),ponto.nick.rei,matrix(rep(1:t,each=m),ncol=t),FUN=cumsum)
  
    #Porem, o nosso interesse é saber, em cada trajetória e a cada movimento, o acumulado de escaques que foram repetidos até esse momento da trajetória
    #Por lógica, os escaques repetidos devem ter um número maior de 1 em "rep.eachmov.rei",
    #assim, utilizamos a mesma fórmula, ave, sobre "rep.eachmov.rei", mas somente naqueles escaques nos quais 1> es verdadeiro (true),
    #dividimos essa matriz a partir da mesma matriz anterior criada para reconhecer as trajetórias simuladas diferentes,
    #e aplicamos cumsum aos subconjuntos:
    
    r.rei=ave(rep.eachmov.rei>1, matrix(rep(1:t,each=m),ncol=t),FUN=cumsum)
    
    #Continuamos com o projeto
    ## "3)Área líquida ocupada (l): ...é o resultado desta operação: l=m+1-r." 
    #Temos modificado com respeito ao projeto original, e vamos considerar o primeiro movimento a posição 0, e assim não devemos somar 1 ao numero de movimentos (m)
    #Criamos um vetor com números do 1 até m
    vetor.m=seq(1,m)
    #E restamos o número de escaques repetidos, para obter a área líquida a cada movimento
    l.rei=vetor.m-r.rei
    
    
    ## "4)N° de escaques do mínimo tabuleiro retangular que compreende a trajetória (tab): O mínimo tabuleiro é o resultado da fórmula: tab=(max(x)-min(x)+1)*(max(y)-min(y)+1)"
    #No projeto já explicamos porque era preciso somar 1 a cada lado do retângulo: não estamos trabalhando com portos, se não com escaques, e temos que considerar o tamanho do primeiro e o último escaque.
    #O primeiro vamos a procurar o mínimo valor de x em cada movimento, durante a trajetória do rei
    #vamos a utilizar de novo a função ave:
    #Cogemos "rei.x", que contem as coordenadas x do rei, e dividimos a amostra entre a matriz indicadora de trajetória simulada,
    #e aplicamos cummin a cada subgrupo, cummin é o acumulado de valores mínimos (o valor mínimo até esse momento da trajetória)
     min.x.rei=ave(rei.x,matrix(rep(1:t,each=m),ncol=t),FUN=cummin)
    
    #Agora precisamos o valor máximo de x na trajetória do rei, fazemos a mesma coisa, mas com a função cummax
    max.x.rei=ave(rei.x,matrix(rep(1:t,each=m),ncol=t),FUN=cummax)
    
    
    #Agora fazemos a mesma coisa com a coordenada y da trajetória do rei
    #primeiro a y mínima
    min.y.rei=ave(rei.y,matrix(rep(1:t,each=m),ncol=t),FUN=cummin)
    #depois a y máxima
    max.y.rei=ave(rei.y,matrix(rep(1:t,each=m),ncol=t),FUN=cummax)
    
    #Agora já temos os argumentos para calcula o mínimo tabuleiro rectangular (tab), segundo a fórmula descrita
    tab.rei=(max.x.rei-min.x.rei+1)*(max.y.rei-min.y.rei+1)
    
    #Seguimos com o projeto
    ## "5)Medidas proporcionais da área: Com o objetivo de comparar as distintas medidas de área propostas consideramos interessantes os seguintes índices:
    ##-% Área líquida/máx. teórico de área líquida:(l*100)/m
    rei.prop.1=matrix((l.rei*100)/vetor.m,ncol=t)
    ##%Área líquida/mín. tabuleiro: (l*100)/tab
    rei.prop.2=matrix((l.rei*100)/tab.rei,ncol=t)
    ##% Máx. teórico de área líquida/mín. tabuleiro: (tab*100) /m Aqui temos invertido a equação, considerando melhor após observar as saidas do boxplot de scacorum.calc
    rei.prop.3=matrix((tab.rei*100)/vetor.m,ncol=t)

    
    ###Procedemos igual com o cavalo
    
    #Vetor para reconhecer cada escaque
    ponto.nick.cav=matrix(paste0(cav.x,"/",cav.y),nrow=m)
    
    #Agora, faremos o vetor que indica em cada simulação (coluna), e em cada movimento (linha) quantas vezes foi ocupada o escaque presente até esse movimento da trajetória.
    rep.eachmov.cav=ave(matrix(1,nrow = m, ncol=t),ponto.nick.cav,matrix(rep(1:t,each=m),ncol=t),FUN=cumsum)
    
    #E, o numero de escaque repetidos a cada movimento
    r.cav=ave(rep.eachmov.cav>1, matrix(rep(1:t,each=m),ncol=t),FUN=cumsum)
    
    #Área líquida ocupada 
    l.cav=vetor.m-r.cav
    
    #Coordenada x
    #O acumulado de valores mínimo (o valor mínimo até esse momento)
    min.x.cav=ave(cav.x,matrix(rep(1:t,each=m),ncol=t),FUN=cummin)
    #O valor máximo
    max.x.cav=ave(cav.x,matrix(rep(1:t,each=m),ncol=t),FUN=cummax)
    
    #Coordenada y
    #mínima
    min.y.cav=ave(cav.y,matrix(rep(1:t,each=m),ncol=t),FUN=cummin)
    #máxima
    max.y.cav=ave(cav.y,matrix(rep(1:t,each=m),ncol=t),FUN=cummax)
    
    #Mínimo tabuleiro rectangular (tab)
    tab.cav=(max.x.cav-min.x.cav+1)*(max.y.cav-min.y.cav+1)
    
    
    ##-% Área líquida/máx. teórico de área líquida:(l*100)/m 
    cav.prop.1=matrix((l.cav*100)/vetor.m,ncol=t)
    ##%Área líquida/mín. tabuleiro: (l*100)/tab
    cav.prop.2=matrix((l.cav*100)/tab.cav,ncol=t)
    ##% Máx. teórico de área líquida/mín. tabuleiro: (tab*100) /m
    cav.prop.3=matrix((tab.cav*100)/vetor.m,ncol=t)
    
    
  #Agora vamos criar uma lista com 16 matrices com todos os resultados, 8 matrices do rei e 8 do cavalo, com as trajetórias (x e y) e com as medidas espaciais
    simulações=list(rei.x,rei.y,r.rei,l.rei,tab.rei,rei.prop.1,rei.prop.2,rei.prop.3, cav.x,cav.y,r.cav,l.cav,tab.cav,cav.prop.1,cav.prop.2,cav.prop.3)
  #Colocamos os nomes nas matrizes
     names(simulações)=c("rei.x","rei.y","r.rei","l.rei","tab.rei","rei.%l/m","rei.%l/tab","rei.%tab/m", "cav.x","cav.y","r.cav","l.cav","tab.cav","cav.%l/m","cav.%l/tab","cav.%tab/m")
    #E pedimos que nos devolva a lista
      return(simulações)
 
    }
  
  else
  #Esse else quer dizer: se o argumento source não é nulo, então...
    #No caso, a gente vai permitir que o usuário crie uma tabela com os movimentos primários de uma peça inventada,
    #O usuário deve colocar um objeto com a tabela e lhe atribuir um nome, o argumento source seria esse nome
    {
      #criamos uma matriz igual à das peças anteriores, vamos chamar "invent" aos objetos criados.
      ordem.mov.sim.invent=matrix(NA, ncol=t, nrow=m)
      for(i in 1:t)
      {
        
        #vetor com o comprimento do numero de movimentos (m), enchido aleatoriamente com um número de movimentos da matriz inventada.
        ordem.mov.invent=sample(c(1:length(source[1,])),m-1, replace=T)
        #Colocamos os vetores na segunda posição da matriz (deixamos reservado espaço para o movimento inicial)
        ordem.mov.sim.invent[2:m,i]=ordem.mov.invent
         }
      
      #Agora vamos a traduzir os movimentos primários em trajetórias
      
      #O seguinte vetor traduz cada número de movimento primário ao correspondente movimento de x. Ao criar a matriz o usuario devera colocar a x na primeira coluna e a y na segunda.
      invent.mov.x=matrix(source[ordem.mov.sim.invent,1], nrow=m)
      #A mesma coisa com a y
     invent.mov.y=matrix(source[ordem.mov.sim.invent,2], nrow=m)
      
      #Agora vamos colocar o ponto inicial na sequencia de movimentos
     #O 0 inicial da x 
     invent.mov.x[1,]=rep(0,t)
     #E o 0 inicial da y
      invent.mov.y[1,]=rep(0,t)  
      
      #Para obter as coordenadas, agora temos que somar os movimentos da x e da y.
      #da x
      invent.x=apply(invent.mov.x,2,FUN = cumsum)
      #e da y
     invent.y=apply(invent.mov.y,2,FUN = cumsum)
    
     #Agora as medidas espaciais 
     #Vetor para reconhecer cada escaque
     ponto.nick.invent=matrix(paste0(invent.x,"/",invent.y),nrow=m)
     
     #Agora, faremos o vetor que indica em cada simulação (coluna), e em cada movimento (linha) quantas vezes foi ocupado o escaque presente até esse movimento da trajetória.
     rep.eachmov.invent=ave(matrix(1,nrow = m, ncol=t),ponto.nick.invent,matrix(rep(1:t,each=m),ncol=t),FUN=cumsum)
     
     #E, o numero de escaque repetidos a cada movimento
     r.invent=ave(rep.eachmov.invent>1, matrix(rep(1:t,each=m),ncol=t),FUN=cumsum)
     
     #Área líquida ocupada
     #Criamos um vetor do primeiro até o último movimento
     vetor.m=seq(1,m)
     #E calculamos a cada movimento a área líquida, restando a m os escaques repetidos
     l.invent=vetor.m-r.invent
     
     #Continuamos com o mínimo tabuleiro, achamos os mínimos e máximos valores da coordenada x
     #O acumulado de valores mínimos
     min.x.invent=ave(invent.x,matrix(rep(1:t,each=m),ncol=t),FUN=cummin)
     #O acumulado de valores máximos
     max.x.invent=ave(invent.x,matrix(rep(1:t,each=m),ncol=t),FUN=cummax)
     
     #E a mesma coisa com a Coordenada y
     #mínima
     min.y.invent=ave(invent.y,matrix(rep(1:t,each=m),ncol=t),FUN=cummin)
     #máxima
     max.y.invent=ave(invent.y,matrix(rep(1:t,each=m),ncol=t),FUN=cummax)
     
     #Mínimo tabuleiro rectangular (tab)
     tab.invent=(max.x.invent-min.x.invent+1)*(max.y.invent-min.y.invent+1)
     
     
     ##-% Área líquida/máx. teórico de área líquida:(l*100)/m 
     invent.prop.1=matrix((l.invent*100)/vetor.m,ncol=t)
     ##%Área líquida/mín. tabuleiro: (l*100)/tab
     invent.prop.2=matrix((l.invent*100)/tab.invent,ncol=t)
     ##% Máx. teórico de área líquida/mín. tabuleiro: (m *100) /tab
     invent.prop.3=matrix((tab.invent*100)/vetor.m,ncol=t) 
    
     #Criamos uma lista com 8 tabelas com as coordenadas e com as medidas espaciais da peça inventada 
      simulações.invent=list(invent.x,invent.y,r.invent,l.invent,tab.invent,invent.prop.1, invent.prop.2,invent.prop.3)
      #Colocamos os nomes nas matrices
      names(simulações.invent)=c("invent.x","invent.y","r.invent","l.invent","tab.invent","invent.%l/m","invent.%l/tab","invent.%tab/m")  
      
      #E pedimos que retorne a lista
       return(simulações.invent)
  #Fechamos a parte "invent" da função   
      
  }
#E fechamos a toda a função scacorum.sim 
}


########################################################################



#Agora vamos a programar scacorum.calc, para utilizar essa função o usuário previamente deve ter desenvolvido as simulações com scacorum.sim e criado um objeto com elas,
#O nome desse objeto deverá ser introduzido no primeiro argumento (dados) de scacorum.calc
#Com o resto de argumentos selecionamos uma medida espacial, escolhemos que estatístico operar, e configuramos a amostra que vamos a analisar
scacorum.calc=function(dados,nm,surfmeas,estimator,intra.inter,peça)
#Abrimos a função
  {
 #Criamos um objeto indicando o límite no número de movimentos (nm), que será o número máximo de movimentos simulados no objeto "dados" (m)
  nm.limite=length(dados[[1]][,1])
   #Colocamos um condicional com todas as possibilidades de nm estar errado
  if(is.element(nm,c(1:nm.limite))==FALSE ) 
    
  {
    #E indicamos que, caso estiver errado interrompa a função e envie uma mensagem de erro
    stop(paste("m deve ser um inteiro maior de 1 e menor do número máximo de movimentos simulados (", nm.limite,")"))
    
  
  }
  #Fazemos a mesma coisa com as medidas de superfície, que tem 6 opções (r,l,tab,l/m,l/tab,tab/m)
  if(is.element(surfmeas,c(1:6))==FALSE )
    
  {
    #...interrupção e mensagem de erro
    stop("surfmeas deve ser um número inteiro do 1 ao 6")
    
  } 
  #Temos 4 opções de estimador, média, sd, min, max
  if(is.element(estimator,c(1:4))==FALSE )
    
  {
    #...interrupção e mensagem de erro
    stop("estimator deve ser um número inteiro do 1 ao 4")
    
  }
  #intra (1) significa que o estatístico é calculado entre as trajetórias a cada movimento,inter (2) significa que o estatístico é calculado sobre o total de movimentos de cada trajetória (em principio parece contra-intuitivo, mas depois quando vejam o boxplot vão ver porque chamei intra e inter)
  if(is.element(intra.inter,c(1:2))==FALSE )
    
  {
   #E a função para se não for o 1 ou 2
     stop("intra.inter deve ser ou o 1 ou o 2")
    
  }
  #Temos três opções de peças, 1) rei, 2) cavalo, 3)peça inventada
  if(is.element(peça,c(1:3))==FALSE )
    
  {
    #...interrupção e mensagem de erro
    stop("peça deve ser um número inteiro do 1 ao 3")
    
  } 
  #Tanto se a peça é 1 (rei) quanto se for 3 (peça inventada), os dados vão estar nas primeiras 8 matrices da lista do objeto "dados"
  if(peça==1|peça==3)
  {
    #Como as duas primeiras matrices contem a trajetória da peça (x e y), temos que somar 2 ao valor de surfmeas
  dados=dados[[surfmeas+2]][1:nm,]
  }
  #Se a peça for 2 (cavalo), a informação figura nas 8 segundas tabelas, assim a tabela 9 vai ter a coordenada x da trajetória do cavalo, a 10 a coordenada y, e da 11 à 16 as medidas espaciais do cavalo
  if(peça==2)
  {
    #Como falado, as medias espaciais do cavalo acham-se depois da matriz 10 da lista de dados
    dados=dados[[surfmeas+10]][1:nm,]
  } 
  #Agora o usuario deve ter colocado corretamente os argumentos, e scacorum.calc já sabe com que amostra trabalhar
 #Criamos um data.frame muito particular, tem quatro componentes, cada um deles é um apply pre-programado para aplicar cada um dos quatro estatísticos
  #O argumento intra.inter nos indica que tipo de cálculo marginal vai fazer, por filas (1), ou por colunas (2), isso é precisamente o que queremos
  result=data.frame(apply(dados,intra.inter,FUN=mean),apply(dados,intra.inter,FUN=sd),apply(dados,intra.inter,FUN=min),apply(dados,intra.inter,FUN=max))
  #O apply que vai calcular está na posição do data.frame que indica o argumento "estimator"
  result.sim=result[estimator]
 #Agora, temos um vetor com todos os possíveis cálculos
  
  #Agora vamos criar objetos com caracteres com a informação dos cálculos estatísticos relevante para o usuário
  #O sumário
  result.summ=summary(result.sim)
  #O desvio padrão
  desvpad=sd(result.sim[,1])
  #Também queremos saber as posições que ocupam os valores mais baixos. Vamos colocar primeiro os valores NA, na verdade, até agora nunca apareceram em nenhuma prova, mas sempre é bom que sejam visíveis caso existissem
  prim.val=head(order(result.sim[,1], decreasing = F,na.last =T))
  #os valores mais altos
  ult.val=head(order(result.sim[,1], decreasing = T,na.last =F))
  #e o/s valor/es da mediana, com a seguinte equação:
  #Qual ou quais (which) valor/es tem a menor diferença com a mediana
  mediana=which (abs(result.sim[,1]-median(result.sim[,1]))==min(abs(result.sim[,1]-median(result.sim[,1]))))
  
  #Agora vamos criar vetores com caracteres referentes aos argumentos, colocados na ordem certa para ser chamados e formar frases coerentes, que ajudem a entender os resultados
  #Precisamos criar frases no título, e no boxplot
  #As medidas espaciais
  medidas=c("escaques repetidos","area líquida","min tabuleiro","l/m","l/tab","tab/m")
 #Os estatísticos
   estim=c("média","sd","min","max")
  #As peças
   peças=c("rei", "cavalo","peça inventada")
   #O seguinte indicará se o boxplot deve considerar as filas ou as colunas, para que coincida o gráfico com o argumento intra-inter
  intr.entr=c(FALSE,TRUE)
  #O seguinte vetor é útil para o título do eixo x
  xclavedim=c("n movimento","n simulação")
  #O seguinte vetor é para construir o título, que fique claro que significa ter escolhido entre intra ou entre
  intra.entre.clave=c("a cada movimento, com ", "entre trajetórias simuladas, com ")
  #O seguinte é o numero total de simulações (lembrem que o numero total de movimentos simulados já foi calculado, nm.limite)
  num.simulaçoes=length(dados[1,])
  #Agora criamos o título colando os diferentes caracteres dos vetores segundo os argumentos selecionados
  titulo=paste("Peça:",peças[peça],",", estim[estimator],"de", medidas[surfmeas],intra.entre.clave[intra.inter], nm," de ",nm.limite, " movimentos, e com ",num.simulaçoes, "trajetórias simuladas") 
 #Abrimos a tela de gráficos
  x11() 
  #E pedimos um boxplot, que permite ter uma ideia de como se distribuem os valores da medida espacial calculada
  #É importante assinalar, que sendo iguais o resto de argumentos, o gráfico não vai mudar trocando o estatítisco
  #Observando a programação do boxplot vemos que os títulos dos eixos mudam com respeito a escolha de argumentos do usuário
  graf.estim=boxplot(dados,use.cols = intr.entr[intra.inter], xlab=paste(xclavedim[intra.inter],"(",peças[peça],")"),ylab= medidas[surfmeas],las=1)
  #pedimos que nos devolva o título, o sumário, o desvio padrão, as posições dos valores mínimos, máximos e mediana
  return (list( título=titulo, sumário=result.summ, desvio_padrão=desvpad,posição_min_val=prim.val,posição_max_val=ult.val,posição_median_val=mediana))
  #E fechamos a função scacorum.calc
}

##########################################################################



#Por último vamos programar scacorum.graf, para ver as trajetórias simuladas
#O argumento dados é um objeto criado com scacorum.sim, que contem trajetórias simuladas
#Com o resto de argumentos escolhemos qual das trajetórias simuladas queremos ver (nt), com quantos movimentos(nm) do total de moviementos simulados,de qual peça(peça) e se queremos observar o caminho que une os movimentos (traj)
scacorum.graf=function(dados,nt,nm,traj,peça)
{
 #de novo, o número limite de trajetórias simuladas
  nt.limite=length(dados[[1]][1,])
  #nt deve ser um numero inteiro entre 1 e o número máximo de trajetórias simuladas em "dados"
    if(is.element(nt,c(1:nt.limite))==FALSE ) 
  {
    #Se não for assim, interrompe a função, e envia mensagem de erro
      stop(paste("nt deve ser um numero inteiro, maior ou igual a 1 e menor do que o número máximo de simulações criadas (", nt.limite,")"))
    
    
  } 

  # A mesma coisa com o número de movimentos, achamos o limite
  nm.limite=length(dados[[1]][,1])
  #E criamos um condicional para os casos em que esteja mal escrito o argumento
  if(is.element(nm,c(1:nm.limite))==FALSE ) 
  
    
  {
    #Se não for assim interrompe e manda mensagem de erro
    stop(paste("nm deve ser um numero inteiro, maior ou igual a 1 e menor do que o número máximo de simulações criadas(", nm.limite,")"))
    
    
  }
  #A visualização da trajetória, sim (1), não (2)
  if(is.element(traj,c(1:2))==FALSE )
    
  {
    #Se não for 1 ou 2 interrompe e envia uma mensagem de erro
    stop("traj deve ser ou 1 (quero ver a trajetória), ou 2 (não quero)")
    
  } 
  #A peça deve ser 1 (rei), 2 (cavalo), ou 3 (peça inventada)
  if(is.element(peça,c(1:3))==FALSE )
    
  {
    #Se não for assim interrompe e envia uma mensagem de erro
    stop("peça deve ser 1 (rei, 2 (cavalo), ou 3 (inventada)")
    
  }
  #Caso a peça seja o rei o peça inventada...
  if(peça==1|peça==3)
  {
    #as coordenadas estarão na primeira matriz de "dados" (x)
    xgraf=dados[[1]][1:nm,nt]
    #e na segunda matriz de "dados" (y)
    ygraf=dados[[2]][1:nm,nt]
  }
  #Se a peça é o cavalo
  
  if(peça==2)
  {
    #Lembremos, no cavalo a coordenada x está na matriz 9
    xgraf=dados[[9]][1:nm,nt]
    #A y na matriz 10
    ygraf=dados[[10]][1:nm,nt]
  } 
  
  

  #Agora criamos dois conjuntos com os limites do gráfico
  #O primeiro conjunto, para o eixo da x, o valor mínimo -0,5, e máximo + 0.5, o motivo de somar meio ponto é, como sempre, porque trabalhamos com escaques, não com pontos. As coordenadas são estimadas no centro do escaque, devemos somar uma metade do primeiro escaque e outra metade do último
  xlimite= c(min(xgraf)-0.5,max(xgraf)+0.5)
  #o segundo cojunto e para o eixo da y
  ylimite= c(min(ygraf)-0.5,max(ygraf)+0.5)
  #Agora aplicamos um jitter, para evitar a sobreposição dos escaques utilizados mais de uma vez
  xjitter=jitter(xgraf)
  #Aplicamos jitter tanto na x quanto na y, pois o resultado é mais estético, na minha opinião
  yjitter=jitter(ygraf)
  
 
   #Abrimos a função TeachingDemos, com ela podemos criar um desenho, e colocá-lo nos pontos de um plot
   
  library(TeachingDemos)
 
  #Para criar o símbolo do rei criei uma simples silhueta dentro de uma quadrícula de 10X10
  #primeiro um polígono com a forma da peça do rei (desculpem o desenho, eu não sou nenhum artista), 
  #primeiro a x
  x.dsnh.rei=c(0,1,2,3,3,2,2,3,3,4,4,5,5,4,4,5,6,7,6,1,0)
  #e depois a y
  y.dsnh.rei=c(6,4,6,4,7,7,8,8,9,9,8,8,7,7,4,6,4,6,0,0,6)
 
  #A função que vamos utilizar"mysymbols", dentro do pacote "TeachingDemos" exige que o polígono a plotar tenha as coordenadas entre -1 e 1, 
  #assim, primeiro dividimos entre 10 as coordenadas
 #A coordenada x
   x.pad.rei=x.dsnh.rei/10
   #e a coordenada y
  y.pad.rei=y.dsnh.rei/10
#E agora vamos a centrar o desenho,cujos valores são todos positivos entre 0 e 1
  #Para as coordenadas x, primeiro restamos o valor mínimo da x, para que o valor mínimo seja 0
  #depois restamos a metade do comprimento da figura (valor máximo menos mínimo), para que fique bem centrado
  x.pad.centr.rei=x.pad.rei-min(x.pad.rei)-(max(x.pad.rei)-min(x.pad.rei))/2
  #E fazemos a mesma coisa com as coordenadas y
  y.pad.centr.rei=y.pad.rei-min(y.pad.rei)-(max(y.pad.rei)-min(x.pad.rei))/2
  #E criamos uma matriz com as coordenadas do poligono com a forma do cavalo
  simbolo.rei=as.matrix(cbind(x.pad.centr.rei,y.pad.centr.rei))
  
  #agora criamos o cavalo (dei o meu melhor...)
  #coordenada x
  x.dsnh.cav=c(1.8,2.3  ,2.3,2.7,2.7,3.2, 3.2, 3.1 ,2.9,2.7, 2.2  ,2, 1.95 ,  1.8,1.5,1.3, 1.5,2.1    ,2.5   ,3,2.8,5,6,      6.2  ,6  , 5.8,5.5,5.8  ,5.8,6.3,6.3,1.8,1.8)
  #coordenada y
  y.dsnh.cav=c(  1,1  ,1.5,1.5 ,2  ,3   , 4 ,4.4  ,4.3,4.1, 3.6  ,3,  3.2 ,  3.1,3.4,4  , 5  ,6.3    ,7.1   ,8,9  ,7,5,     3.4  , 2.3 ,1.8 ,1.5  , 1.5,1,  1,  0,0  ,1)
  
  #Colocamos as coordenadas entre 0 e 1
  #a x
  x.pad.cav= x.dsnh.cav/10
  #a y
  y.pad.cav=y.dsnh.cav/10
  
  #...centramos a x
  x.pad.centr.cav=x.pad.cav-min(x.pad.cav)-(max(x.pad.cav)-min(x.pad.cav))/2
  #a y
  y.pad.centr.cav=y.pad.cav-min(y.pad.cav)-(max(y.pad.cav)-min(x.pad.cav))/2
  #e colocamos numa matriz
  simbolo.cav=as.matrix(cbind(x.pad.centr.cav,y.pad.centr.cav))
  
  #Para a peça inventada vamos a fazer um simples quadrado
  #Vamos fazer o desenho diretamente centrado no 0
  #A x
   x.pad.centr.inv=c(-0.4,-0.4,0.4,0.4,-0.4)
   #E a y 
  y.pad.centr.inv=c(-0.4,0.4, 0.4, -0.4,-0.4)
#E criamos uma matriz com as coordenadas (esse foi o símbolo que ficou melhor)
  simbolo.inv=as.matrix(cbind(x.pad.centr.inv,y.pad.centr.inv))
 #Agora criamos uma lista com os três símbolos, que serão escolhidos conforme indique o argumento "peça" 
  simbolos=list(simbolo.rei,simbolo.cav,simbolo.inv)
  
  #O seguinte vetor será útil para a etiqueta da y, onde colocaremos o nome da peça que está sendo representada
  peças=c("rei", "cavalo","peça inventada")
  
 #abrimos o visor gráfico 
x11()
  
  
 #E pedimos o seguinte gráfico:
  #primeiro indicamos as coordenadas onde queremos colocar os símbolos
  #Depois indicamos a matriz onde ficam as coordenadas dos símbolos de cada peça
  #Depois especificamos o tamanho que queremos os símbolos, medido no mesmo formato do que as unidades do gráfico (assim o simbolo mudará de tamanho conforme o tamanho total do gráfico)
  #add=F significa que não vamos a juntar essa figura a outra figura previamente plotada
  #Marcamos os limites do gráfico (xlim ylim)
  #pty="s" para a visual do eixo x seja do mesmo tamanho que o eixo y
  #type="n" significa, sem mostrar nada na visual, 
      #por que fazer isso? Esse plot vai ser a referencia de uma rede que vamos plotar a continuação, depois voltaremos a plotar o gráfico acima da rede, assim evitaremos que os símbolos fiquem tampados pela rede
  #Depois colocamos a explicação da peça no eixo da y e da trajetória escolhida no eixo da x
  grafico=my.symbols(xjitter,yjitter,simbolos[[peça]][,1:2], xsize=2, ysize=2,add=F,ylim=ylimite,xlim=xlimite,pty="s",type="n",xlab=paste("Trajetoria nº",nt,"de um total de",nt.limite, ", com",nm,"de",nm.limite,"movimentos simulados"),ylab=peças[peça])
  #Agora faremos a rede que divide os escaques, primeiro varias abline na vertical
  abline(v =seq (from=min(xlimite),to=max(xlimite),by=1),col="lightgray")
  #E depois na horizontal
 abline(h =seq (from=min(ylimite),to=max(ylimite),by=1),col="lightgray")
  #E plotamos de novo o gráfico, mas agora colocamos add=T, pois queremos que adjunte no plot (invisível) acima, e não colocamos o modo invisível (type="n")
  grafico=my.symbols(xjitter,yjitter,simbolos[[peça]][,1:2], xsize=2, ysize=2,add=T,ylim=ylimite,xlim=xlimite,pty="s",xlab=paste("trajetoria",nt,"de",nt.limite, "com",nm,"de",nm.limite,"movimentos simulados"),ylab=peças[peça])
 
  #Por último, caso o usuário deseje ver o caminho que une os pontos
  if(traj==1)
  {
    #Adjuntamos umas líneas de movimento a movimento, desde o menor ao máximo valor
    lines(xjitter, yjitter, xlim=range(xjitter), ylim=range(yjitter), pch=16)
    #E reproduz o gráfico
  print(grafico)
  }
  #Se o usuário não colocou 1 no argumento traj, e porque colocou 2 (se tivesse colocado cualquer outra coisa nesse argumento já teria recebido previamente uma mensagem de erro)
  else
  {
    #Assim, se o usuário colocou 2 o gráfico já está pronto
    print(grafico)
}
}

Help das três funções

scacorum.sim                package:nenhum             R Documentation

~~ Simulação de trajetórias aleatórias do rei, do cavalo ou de uma peça inventada de xadrez se movimentando num tabuleiro sem limites. ~~

Description:

     ~~scacorum.sim t cria trajetórias aleatórias de m movimentos do rei do cavalo (versão default) ou de outra peça de xadrez que o usuário cujos movimentos devem ser programados pelo usuário. Nessas simulações as peças se movimentam num tabuleiro sem limites, e são tomadas 6 medidas espaciais a cada movimento. A função simplesmente retorna tabelas matrizes com a informação simulada~~

Usage:

     ~~ scacorum.sim (t, m, source)~~

Arguments:

 ~~ t: Número inteiro do 1 ao 100 indicando o número de trajetórias a simular
m: Número inteiro do 1 ao 1000 indicando o número de movimentos de cada trajetória. O primeiro movimento é considerado a posição inicial, sobre essa posição são calculados m-1 movimentos.
source: Nome da matriz com os movimentos primários da peça inventada. Na versão default (simulações do rei e do cavalo) não devemos colocar nada nesse argumento. A matriz deve ter duas colunas de igual tamanho a primeira com a coordenada x e a segunda com a coordenadas y.
Value:

     ~ 

Na versão default a função devolve 16 tabelas no console, as 8 primeiras com a informação do rei, e as 8 segundas com a do cavalo, na versão “peça inventada” somente devolve 8 tabelas.

  comp1 : Coordenada x da trajetória do rei ou da peça inventada

  comp2 : Coordenada y da trajetória do rei ou da peça inventada

	-Medidas espaciais calculadas a cada movimento do rei ou da peça inventada.
  comp3 : Número de escaques repetidos (r)

comp4 : Área líquida (l), número escaques utilizados descontando os repetidos.
comp5: Mínimo tabuleiro retangular que compreende a trajetória(tab). 
Comp 6: Porcentagem de área líquida sobre o total de movimentos. A área líquida são os escaques utilizados sem contar os repetidos
Comp7: Porcentagem de área líquida sobre o Mínimo tabuleiro retangular que compreende a trajetoria.
Comp8: Porcentagem do mínimo tabuleiro retangular sobre o total de movimentos (os valores podem ser maiores de 100)

Na versão default os componentes 9 a 16 contem idêntica informação, mas da trajetória do cavalo.

     
Warning:
	A função devolve uma mensagem de erro se o usuário introduz um numero inadequado de trajetórias(t): valor menor ou igual a cero, ou número com decimais, ou superior ao máximo previsto (100). A função faz a mesma coisa com o número de inadequado de movimentos (m), o número máximo foi fixado em 1000. Para a opção da peça inventada, o próprio r avisa se não encontra o objeto que contem os movimentos primários (source).



Author(s):

     ~~Marcelo Fernández-Bolaños~~

References:

     ~put references to the literature/web site here ~

See Also:

     ~~objects to See Also as 'help', ~~~

Examples:

     ##scacorum.sim(t,m,source). Nesse exemplo calcularemos 10 trajetorias do rei e 10 trajetorias do cavalo com 100 movimentos, na verdade, 99 movimentos a partir do escaque inicial (0,0))
sim.1=scacorum.sim(10,100)

#Para a opção "invent", precisamos criar uma matriz com os movimentos primários de uma peça inventada, vamos a fazer um peão de exemplo
mov.prim.x.peao=c(1,0,-1)
mov.prim.y.peao=c(1,1,1)
movimentos.prim.peao=as.matrix(cbind(mov.prim.x.peao,mov.prim.y.peao))
sim.peao=scacorum.sim(10,80,movimentos.prim.peao ) 
 
scacorum.calc                package:nenhum            R Documentation

~~ Calcula estatísticos descritivos sobre um objeto criado com a função scacorum.sim , que contem simulações de trajetórias de peças de xadrez ~~

Description:

     ~~ Scacorum.calc permite calcular quatro estatísticos descritivos sobre seis medidas de superfície de trajetórias aleatórias do rei, do cavalo, ou de outra peça inventada de xadrez. O usuário pode escolher o número de movimentos a analisar e como calcular o estatístico (intra ou entre trajetórias).
Usage:

     ~~ scacorum.calc (dados,nm,surfmeas,estimator,intra.inter,peça)

Arguments:

 ~~ 
dados: Nome de objeto criado com a função com a função scacorum.sim que contem um lista de matrizes com informação sobre trajetórias aleatória de peças de xadrez.
-nm: Numero de movimentos sobre o total de movimentos simulados (m) do objeto dados. Número inteiro do 1 ao m. 
-surfmeas: Medida de espacial sobre a qual queremos estimar o estadístico. Número inteiro do 1 ao 6: (1) escaques repetidos, 2) área líquida, 3)mínimo tabuleiro retangular, 4) porcentagem de área líquida sobre o total de movimentos, 5) porcentagem de área líquida sobre o Mínimo tabuleiro retangular,  6) porcentagem do mínimo tabuleiro retangular sobre o total de movimentos

-estimator: Estatístico exploratório que queremos calcular. Número inteiro do 1 ao 6: 1)média, 2) desvio padrão , 3)valor mínimo, 4)valor máximo.
-intra.inter: Número inteiro: 1) a cada movimento o estatístico é calculado entre trajetórias (para comparar entre movimentos), 2) O estático é calculado sobre o total de todas as trajetórias (para comprar entre trajetórias)
-peça: Número inteiro: 1)rei, 2)cavalo, 3) peça inventada.


~~

Value:

     ~ 

Scacorum.calc devolve uma lista com vários resultados
  comp1 : Título explicativo dos argumentos que foram escolhidos pelo usuário (ex: "cavalo , média de escaques repetidos a cada movimento, com  100  de  100  movimentos, e com  10 trajetórias simuladas"


  comp2 : Sumario com o valor mínimo, o primeiro quantil, a mediana, a média, o terceiro quantil e o valor máximo 
comp3:Desvio padrão 
comp4:Posição dos primeiros valores máximos. Quando no argumento intra-inter escolhemos 1,nos indica com quantos movimentos obtemos os valores máximos do estatístico, escolhendo 2 na opção intra-inter nos inca as trajetórias que apresentaram os valores máximos do estatístico. A última indicação serve para os seguintes dois componentes (5 e 6), estas saídas foram pensadas para selecionar quais trajetórias visualizar com a função scacorum.graf.

comp5: Posição dos primeiros valores mínimos

comp6:Posição do/s valor/es da mediana

Também aparece um gráfico boxplot que permite visualizar como se distribuem os valores da medida de superfície selecionada, com a amostra selecionada.
     
Warning:
	Se o usuário introduz um valor fora do intervalo de um argumento (os intervalos foram indicados acima) a função devolve uma mensagem de erro. Para o correto funcionamento de scacorum.calc o usuário deve entender a posição de cada argumento, porem, sempre recomendamos observar o título para evitar confusões. 


Author(s):

     ~~Marcelo Fernández-Bolaños~~

Examples:

#Primeiro precisamos das simulaçoes criadas com scacorum.sim
sim.1=scacorum.sim(10,100)
##scacorum.calc(dados,nm,surfmeas,estimator,intra.inter,peça). Nesse exemplo calculamos a média de escaques repetidos calculado a cada moviemento entre as trajetórias do rei, incluindo todos os 100 movimentos simulados (em sim.1)
scacorum.calc(sim.1,100,1,1,1,1)

sim.peao=scacorum.sim(10,80,movimentos.prim.peao )
##Nesse outro exemplo, calculamos o desvio padrão de tab/m calculado sobre o total de trajetórias simuladas, com  50  de  100  movimentos simulados (movimentos.prim.peao) da peça inventada (o peão)
scacorum.calc(sim.1,50,6,2,2,3)

scacorum.graf                package:nenhum            R Documentation

~~ Mostra a trajetória de uma peça de xadrez, previamente criada com a função scacorum.sim ~~

Description:

     ~~ Apresenta uma imagem da trajetória de uma peça de xadrez criada com a função scacorum.sim, pudendo escolher a quantidade de movimentos, e se queremos ou não visualizar a trajetória que une os movimentos ~~

Usage:

     ~~ scacorum.graf (dados,nt,nm,traj, peça) 
Arguments:

 ~~ 
dados: Nome de objeto criado com a função com a função scacorum.sim 
-nt: Numero de trajetória que queremos visualizar, numero inteiro de 1 até o máximo de trajetórias que contem o objeto dados.
-nm: numero de movimentos que queremos visualizar, numero inteiro de 1 até o máximo de movimentos simulados no objeto  dados.
-traj: Indica 1)quero visualizar a trajetória que conecta ordinalmente os escaques, 2) não quero visualizá-la.
-peça: 1)rei, 2)cavalo, 3) peça inventada.


~~ 

Details:

     ~~ É necessário ter o pacote "TeachingdDemos" para visualizar o gráfico
~~

Value:

     ~ 

Scacorum.graf  devolve um gráfico mostrando trajetória dados os argumentos selecionados
  
Warning:
	Se o usuário introduz um valor fora do intervalo de um argumento (os intervalos foram indicados acima) a função devolve uma mensagem de erro.


     ~ ~

Author(s):

     ~~Marcelo Fernández-Bolaños~~


Examples:
#Precisamos instalar o pacote TeachingdDemos
install.packages("TeachingdDemos")
#Depois precisamos  ter um objeto criado com scacorum.sim
sim.1=scacorum.sim(10,100)
# scacorum.graf=function(dados,nt,nm,traj,peça). Nesse exemplo veremos a primeira trajetoria do rei, com todos os 100 movimentos simulados (no objeto scacorum.sim), observando a trajetoria que une os movimentos
scacorum.graf(sim.1,1,100,1,1)
#Nesse outro exemplo vemos a quinta trajetória do cavalo, com 50 de 100 movimentos simulados (no objeto scacorum.sim), sem observar a trajetoria que une os movimentos
scacorum.graf(sim.1,5,10,2,2)



05_curso_antigo/r2017/alunos/trabalho_final/marcelusgualax/funcao_scacorum.txt · Última modificação: 2020/08/12 06:04 (edição externa)