Вычислить z-оценку для всех столбцов с помощью awk - PullRequest
2 голосов
/ 06 мая 2020

У меня есть файл, содержащий первый столбец идентификаторов, а все остальные столбцы - это числовые значения, которые я хочу вычислить по z-значениям. Я знаю, что есть много сообщений для расчета z-оценки с использованием Python и R. Я не знаком с Python и не хочу использовать R. У меня уже есть способ вычислить среднее значение и стандартное отклонение все мои столбцы (у меня 30 столбцов), но мне нужно рассчитать z-баллы для каждого столбца, и я не уверен, как это сделать, или если это возможно с помощью awk.

Мои данные с разделителями табуляции, например:

ID  W   A    
BR_400  1005.98 19.35   
FG_50   434.89  2.987    
DS_195_At   39.86   0.567 
ES_23_Md    41.45   19.55 

Моя команда для вычисления среднего и стандартного значений для всех столбцов:

cat input.txt | awk '{for(i=1;i<=NF;i++) {sum[i] += $i; sumsq[i] += ($i)^2}} END {for (i=1;i<=NF;i++) {printf "%f %f \n", sum[i]/NR, sqrt((sumsq[i]-sum[i]^2/NR)/NR)}}' > mean_std.txt

Формула z-оценок:

z = (x – mean) / std

Есть предложения?

Ожидаемый результат содержит только z-значения для каждого столбца:

ID W zscore A zscore  
BR_400  1.370068724 0.852212191
FG_50   0.119047359 -0.743935933
DS_195_At   -0.746299556    -0.979997685
ES_23_Md    -0.742816526    0.871721427

1 Ответ

1 голос
/ 06 мая 2020

Вы можете использовать это awk:

awk 'BEGIN {
   FS=OFS="\t"
}
NR == 1 {
   print
   next
}
NR == FNR {
   ++n
   for(i=2;i<=NF;i++) {
      sum[i] += $i
      sumsq[i] += ($i)^2
   }
   next
}
FNR == 1 { # compute mean and std values here
   for (i=2;i<=NF;i++) {
      mean[i] = sum[i]/n
      std[i] = sqrt( (sumsq[i] - sum[i]^2/n) / (n-1) )
   }
   next
}
{
   printf "%s", $1 OFS
   for (i=2;i<=NF;i++)
      printf "%f%s", ($i - mean[i]) / std[i], (i < NF ? OFS : ORS)
}' file file | column -t

ID         W          A-scor
BR_400     1.370069   0.852212
FG_50      0.119047   -0.743936
DS_195_At  -0.746300  -0.979998
ES_23_Md   -0.742817  0.871721
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...