====== Proposta de função final ======
===== Plano B: Calculo de L de Ripley =====
OBS: selecionar a funçao toda para rodar.
No rstudio, ao executar apenas a primeira linha (function()), estava bugando.
pad.esp = function(x, y, lim, rmax = max((lim[2]-lim[1]),(lim[4]-lim[3]))/2, r = 1, ic = TRUE, conf = c(0.05, 0.95), nsim = 100, plot = TRUE) #função com os argumentos x, y, lim, rmax, r, ic, conf e nsim, sendo o defaut da função especificado por "= ..."
{
#######Verificação de parametros#########
if(sum(x<0) !=0 |class(x)!="numeric"&class(x)!= "integer") #se x for menor que zero ou a classe for diferente de numeric e integer,
{stop("x deve ser numerico ou inteiro e maior que 0.")} #para e imprime a mensagem
if(sum(y<0) !=0 |class(y)!="numeric"&class(y)!= "integer") #se y for menor que zero ou a classe for diferente de numeric e integer,
{stop("y deve ser numerico ou inteiro e maior que 0.")} #para e imprime a mensagem
if(length(x)!=length(y)) #se o comprimento de x e y é diferente
{stop("x e y devem ter o mesmo comprimento")} #para e imprime a mensagem
if(length(lim)!=4|class(lim)!="numeric"&class(lim)!= "integer") #se o comprimento de lim não é 4 e a classe não é numeric e integer,
{stop("lim deve ser numerico ou inteiro e com comprimento 4")} #para e imprime a mensagem
if(length(rmax)!=1|class(rmax)!= "integer"&class(rmax)!="numeric") #se o comprimento de lim não é 1 e a classe não é numeric e integer,
{stop("rmax deve ser inteiro ou numerico e de comprimento 1")} #para e imprime a mensagem
if(length(r)!=1|class(r)!= "integer"&class(r)!="numeric") #se o comprimento de r não é 1 e a classe não é numeric e integer,
{stop("r deve ser inteiro e de comprimento 1")} #para e imprime a mensagem
if(length(nsim)!=1|class(nsim)!= "integer") #se o comprimento de nsim não é 4 e a classe não é integer,
{warning("nsim deve ser inteiro e de comprimento 1")} #imprime a mensagem de aviso
if(class(ic)!="logical") #se ic não é logico
{stop("ic deve ser logico")} #para e imprime a mensagem
if(class(plot)!="logical") #se plot não é logico
{stop("plot deve ser logico")} #para e imprime a mensagem
if(r>=rmax) #se r é maior ou iguala rmax
{stop("rmax deve ser maior que r")} #para e imprime a mensagem
if(conf[1]>conf[2]) #se a segunda posição de ic for maior que a primeira
{stop("ic deve conter os quantis minimo e máximo, respectivamente")} #para e imprime a mensagem
########## Criando objetos prévios ###########
distancia = matrix(NA, ncol = length(x), nrow = length(y)) #cria matriz que irá guardar a distancia de cada ponto, com número de linhas e colunas igual ao comprimento de x e y.
ntot = length(x) #guarda comprimento de x
dens = ntot/((lim[2] - lim[1])*(lim[4] - lim[3])) #calcula a densidade de pontos na area de estudo.
sequ = seq(from = 1, to = rmax, by = r) #guarda o valor dos raios a serem utilizados em oring
ind = matrix(rep(NA, times = rmax*ntot), nrow = length(1:rmax), ncol = ntot) #cria matriz que irá guardar quantos pontos são menores que um determinado raio, com NAs. O numero de linhas é rmax e o de colunas ntot
dimnames(ind) = list(paste("r", 1:rmax, sep = ""), paste("p", 1:ntot, sep = "")) #altera em ind os nomes das linhas para o raio (r) e colunas para o ponto (p) correspondente.
############Calculos para os meus dados###########
distx = as.matrix(dist(x, upper=T)) #cria matriz de distancias em x
disty = as.matrix(dist(y, upper=T)) #cria matriz de distancias em y
distancia = sqrt((distx^2 + disty^2)) #calcula a distância euclidiana entre todos os pontos
for(i in 1:rmax) #ciclo for de 1 a rmax
{
ind[i,] = apply(distancia, 2, FUN = function(x) {sum(xripquantis[,2])] = "agregado" #atribui "agregado" para todos os rippad que são maiores que ripquantis (limite superior do intervalo)
rippad[which(rip>=ripquantis[,1]&rip<=ripquantis[,2])] = "aleatório" #atribui "aleatorio" para todos os rippad que estão entre o IC
ringpad = ring #cria objeto ringpad igual a rip
ringpad[which(ringringquantis[,2])] = "agregado" #atribui "agregado" para todos os ringpad que são maiores que ringquantis (limite superior do intervalo)
ringpad[which(ring>=ringquantis[,1]&ring<=ringquantis[,2])] = "aleatório" #atribui "aleatorio" para todos os ringpad que estão entre os limites de IC
valores = list(ripley = rip, IC_ripley = ripquantis, oring = ring, IC_oring = ringquantis) #cria lista com os valores calculados e simulados.
##############analise gráfica##############
if(plot==TRUE) #se plot = TRUE
{
par(mfrow = c(1,2)) #divide a janela grafica em 2
plot(c(1:rmax), rip, pch = 20, col = "red", xlab = "Raio", ylab = "L de Ripley") #plota rip~rmax, alterando tipo de ponto e cor
lines(1:rmax, rip, lwd = 2, col = "red") #adiciona linha ligando os pontos plotados anteriormente
lines(1:rmax,ripquantis[,1], lty = 2, lwd = 2) #adiciona linha do IC inferior
lines(1:rmax, ripquantis[,2], lty = 2, lwd = 2) #adiciona linha do IC superior
abline(0, 0, lwd = 2) #adiciona linha horizontal em 0, para comparação
legend(rmax-10, max(rip)-diff(range(rip))*0.02, legend = c("L. Ripley", "Env. Conf.", "zero"), bty = "n", lty = c(1, 2, 1), col = c("red", "black", "black"), cex = 0.7, x.intersp = 0.2, lwd = 2, seg.len = 1) #adiciona legenda para as linhas, mudando tipo de linha, cor, tamanho, espaço entre a lnha e o texto, largura da linha, comprimento do segmento
plot(sequ[-1], ring, pch = 20, col = "red", xlab = "Raio", ylab = "O-Ring") #plota ring~rmax, alterando tipo de ponto e cor
lines(sequ[-1], ring, lwd = 2, col = "red") #adiciona linha ligando os pontos plotados anteriormente
lines(sequ[-1],ringquantis[,1], lty = 2, lwd = 2) #adiciona linha do IC inferior
lines(sequ[-1], ringquantis[,2], lty = 2, lwd = 2) #adiciona linha do IC superior
lines(sequ[-1], rep(dens, times = length(sequ)-1), lwd = 2) #adiciona linha horizontal em dens, para comparação
text(rmax-3, dens+0.1, expression(lambda)) #adciona texto "lambda" em cima da linha horizontal em dens
legend(rmax-10, max(ring)-diff(range(ring))*0.02, legend = c("O-ring", "Env. Conf.", expression(lambda)), bty = "n", lty = c(1, 2, 1), lwd = 2, col = c("red", "black", "black"), cex = 0.7, x.intersp = 0.2, seg.len = 1) #adiciona legenda para as linhas, mudando tipo de linha, cor, tamanho, espaço entre a lnha e o texto, largura da linha, comprimento do segmento
par(mfrow = c(1,1)) #divide a janela grafica em 1}
}
return(list(L_de_Ripley = rippad, O_Ring = ringpad, Valores = valores)) #retorna lista com rippad, ringpad e valores, alterando o nome dos elementos da lista.
}
else{ #se ic = false
if(plot==TRUE) #se plot = TRUE
{
par(mfrow = c(1,2)) #divide a janela grafica em 2
plot(1:rmax, rip, pch = 20, col = "red", xlab = "Raio", ylab = "L de Ripley") #plota rip~rmax, alterando tipo de ponto e cor
lines(1:rmax, rip, lwd = 2, col = "red") #adiciona linha ligando os pontos plotados anteriormente
abline(0, 0, lwd = 2) #adiciona linha horizontal em 0, para comparação
legend(rmax-10, max(rip)-diff(range(rip))*0.02, legend = c("L. Ripley", "zero"), bty = "n", lty = c(1, 1), col = c("red", "black"), cex = 0.7, x.intersp = 0.2, lwd = 2, seg.len = 1) #adiciona legenda para as linhas, mudando tipo de linha, cor, tamanho, espaço entre a lnha e o texto, largura da linha, comprimento do segmento
plot(sequ[-1], ring, pch = 20, col = "red", xlab = "Raio", ylab = "O-Ring") #plota ring~rmax, alterando tipo de ponto e cor
lines(sequ[-1], ring, lwd = 2, col = "red") #adiciona linha ligando os pontos plotados anteriormente
lines(sequ[-1], rep(dens, times = length(sequ)-1), lwd = 2) #adiciona linha horizontal em dens, para comparação
text(rmax-3, dens+0.1, expression(lambda)) #adciona texto "lambda" em cima da linha horizontal em dens
legend(rmax-10, max(ring)-diff(range(ring))*0.02, legend = c("O-ring", expression(lambda)), bty = "n", lty = c(1, 1), lwd = 2, col = c("red", "black"), cex = 0.7, x.intersp = 0.2, seg.len = 1)
par(mfrow = c(1,1)) #divide a janela grafica em 1
}
}
return(list(L_de_Ripley = rip, O_Ring = ring)) #retorna lista com rip e ring mudando o nome dos elementos da lista.
}