如何在Python中的多个文件中计算逐行统计信息

时间:2014-10-13 08:28:34

标签: python scipy

我有一系列以 xy 格式划分的以空格分隔的数据文件,如下所示,用于虚拟数据集,其中 y 表示值的独立样本总体均值X

File1.dat

1 15.99
2 17.34
3 16.50
4 18.12

File2.DAT的

1 10.11
2 12.76
3 14.10
4 19.46

File3.dat

1 13.13
2 12.14
3 14.99
4 17.42

我试图逐行计算平均值(SEM)的标准误差,以了解 x 的每个值的数据传播。作为使用每个文件的第一行( x = 1)的示例,解决方案将首先计算样本总体的SEM,意味着15.9910.11和{{1并以格式打印解决方案:

  

x 1 SEM x1

......依此类推,迭代三个文件中的每一行。

目前,我设想的解决方案是:

  1. 使用numpy之类的东西读入数据,或许只指定当前迭代的感兴趣的行。例如

    13.13
  2. 使用import numpy as np data1 = np.loadtxt('File1.dat') data2 = np.loadtxt('File2.dat') data3 = np.loadtxt('File3.dat') stats等工具,从步骤1中提取的三个样本总体均值中计算SEM

  3. 将结果打印到粗壮

  4. 重复剩下的行

  5. 虽然我认为其他统计数据包(如Scipy)非常适合此任务,但我想尝试将解决方案仅保留在Python中。我对这门语言比较陌生,而且我正试图在使用它时获得一些实际知识。

    我认为这是一个非常适合我R的问题,而不是我在论坛中看到过的问题,但根据文档的说法,没有最简单的想法。

    注意:这些文件包含相同数量的行。

1 个答案:

答案 0 :(得分:1)

首先,让我们尝试获取我们需要的数据列:

import numpy as np
filenames = map('File{}.dat'.format, range(1,4)) # ['File1.dat', ...]
data = map(np.loadtxt, filenames) # 3 arrays, each 4x2
stacked = np.vstack((arr[:,1] for arr in data))

现在我们只需要一个数组中需要的数据:

array([[ 15.99,  17.34,  16.5 ,  18.12],
       [ 10.11,  12.76,  14.1 ,  19.46],
       [ 13.13,  12.14,  14.99,  17.42]])

下一步:

import scipy.stats as ss
result = ss.sem(stacked)

这会给你:

array([ 1.69761925,  1.63979674,  0.70048396,  0.59847956])

您现在可以打印它,将其写入文件(np.savetxt)等


既然你提到了R,那么我们也试试吧!

filenames = c('File1.dat', 'File2.dat', 'File3.dat')
data = lapply(filenames, read.table)
stacked = cbind(data[[1]][2], data[[2]][2], data[[3]][2])

现在你有:

     V2    V2    V2
1 15.99 10.11 13.13
2 17.34 12.76 12.14
3 16.50 14.10 14.99
4 18.12 19.46 17.42

最后:

apply(stacked, 1, sd) / sqrt(length(stacked))

给你:

1.6976192 1.6397967 0.7004840 0.5984796

这个R解决方案在性能方面实际上相当差一些,因为它在所有行上使用apply来获得标准偏差(并且apply很慢,因为它调用了目标函数每排一次)。这是因为基础R不提供行方式(也不是列方式等)标准偏差。我需要sd,因为基地R不提供SEM。至少你可以看到它给出相同的结果。