我有一系列以 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.99
,10.11
和{{1并以格式打印解决方案:
x 1 SEM x1
......依此类推,迭代三个文件中的每一行。
目前,我设想的解决方案是:
使用numpy之类的东西读入数据,或许只指定当前迭代的感兴趣的行。例如
13.13
使用import numpy as np
data1 = np.loadtxt('File1.dat')
data2 = np.loadtxt('File2.dat')
data3 = np.loadtxt('File3.dat')
stats等工具,从步骤1中提取的三个样本总体均值中计算SEM
将结果打印到粗壮
重复剩下的行
虽然我认为其他统计数据包(如Scipy
)非常适合此任务,但我想尝试将解决方案仅保留在Python中。我对这门语言比较陌生,而且我正试图在使用它时获得一些实际知识。
我认为这是一个非常适合我R
的问题,而不是我在论坛中看到过的问题,但根据文档的说法,没有最简单的想法。
注意:这些文件包含相同数量的行。
答案 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。至少你可以看到它给出相同的结果。