Regressão linear usando Shell Bash + AWK

Publicado por Perfil removido (última atualização em 27/06/2016)

[ Hits: 3.162 ]

Download linear_simples.sh




Ouvi falar do AWK enquanto estudava Programação Shell Linux, Júlio César; e de maneira bem cômica, ele explica um pouco dessa "Linguagem/Ferramenta/Tudo de bom". kkk

Então vi grande potencial para resolver alguns problemas que gastaria muito tempo, as vezes.

Bem, para quem faz alguma  Análise de Dados, e desses dados necessite fazer regressão linear com cálculo das incertezas, vi que o AWK é excelente para fazer tal coisa.

E resolvi compartilhar com a comunidade esse pequeno trabalho, fiquem a vontade para compartilhar, melhorar e contribuir para o maior uso dessa fantástica ferramenta.

Então, basta fazer:

./linear_simples.sh "dados.dat"

por exemplo, e pronto, um arquivo com tudo. Ou quase tudo. ;)

  



Esconder código-fonte

#/bin/bash

#---Regressao linear simples------------#
# usando awk e shell            
# Autor: Marcos E. O. Sales         
# email: marcossales.eng@gmail.com     
#               
# feito:03/05/2016         
# ultima atualizacao:04/05/2016      
               
#---Regressao linear simples------------#
#---(Utilidade)--------------------------------#
#Fazer regressao atraves simples atravez
# da reta y = a + b*x          
# atraves de uma entrada de dados.   
#-------------------------------------------------#
# versao: 1.1            
#==============================#

#-------Definindo funcoes------------------------------------------------------#
Uso()
{
sed -n '/^# ultima/,/^# versao:/ {/^# ultima/b; /^# versao:/b; 1,$p;}' $(basename $0)
echo
echo "Uso: $(basename "$0") ARQ.dat"
echo "Onde ARQ.dat e um arquivo com os valores: Dados x Dados Y"
echo -e "\nPara retornar um arquivo formatado com os dados,e com os parametros analizados"
exit 0
}
#
Regressao()
{
clear
sed '1d' "$Dados" |\
awk '
BEGIN { printf "%8s %13s %13s \n",
      "Dados X", "Dados Y", "sigma Y" } #colocar primeira linha
{
printf "%8e %13e %8e\n",$1, $2, $3  #printa dados formatados

}
#operacoes
{
Somax = Somax + $1 ; Somay = Somay + $2 

Mediax = Somax / NR
Mediay = Somay / NR

somaquadx+=$1*$1
somaquady+=$2*$2
somaxy+=$1*$2
}
{
cov = ($1-Mediax)*($2-Mediay)
desvx = sqrt(($1-Mediax)^2)
desvy = sqrt(($2-Mediay)^2)
delta = (NR*somaquadx-Somax^2)
}
END{

a = ((somaquadx*Somay)-(Somax*somaxy))/(delta)
b = ((NR*somaxy) - (Somax*Somay))/(delta)

sigmay = sqrt((1/(NR-2))*(($2-a-b*$1)^2))
sigmaa = sigmay*sqrt(somaquadx/delta)
sigmab = sigmay*sqrt(NR/delta)

r = cov/(desvx*desvy)

 printf "\n%7s\n%8s %7e\n%8s %10e\n %15s \n %1s %8e \n %8s %8e \n %1s %8e\n %8s %8e\n %8s %8e \n" ,
   "\nParametros:\n", "Media X:", Mediax , "Media Y:", Mediay, "Regressao: y = b*x + a",
   "a:", a, "sigma a:",sigmaa,"b:",b,"sigma b:",sigmab, "Correlacao",r 
 printf "\n%7s %8e\n%7s %8e \n%7s %8e\n",
      "covariancia:",cov, "desvio x",desvx, "desvio y", desvy}' |tee resultado.txt
}

#----Definindo o case----------------------------------------------------------#
case $# in
   0) Uso
   ;;
   1) Dados="$1"; Regressao 
   ;;
   *) echo -e "\033[01;31mNumero de parametros errados.\033[m"
   Uso
   ;;
esac
#--------------------------------------------------------------------------------------#
#         Fim do User                  
#--------------------------------------------------------------------------------------# 

Scripts recomendados

Mostrar as partições existentes no HD

Script Para Formatação de Texto Com Cabeçalho, Rodapé e Campos de Dados Originados de Arquivo em AWK

Pesquisa de grupos do sistema por nome ou GID em AWK

Bytes utilizado por usuário

Utilização de memória swap no Solaris ( swap memory utilization in Solaris )


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts