====== 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)