1

我必须通过生成所需变量的均值、中位数、标准差和四分位间距 (IQR) 来聚合(当然使用分类中断变量)一个包含一些连续变量的相当大的数据表。

前三个使用 SPSS Aggregate命令很容易,但我不知道如何通过聚合数据表来计算 IQR。

我知道我可以使用Descriptives(按四分位数)计算 IQR,但由于我需要聚合计算 - 这不是一个选项。不幸的是,由于一些奇怪的情况,使用 R 也失败了(不能在 R 中加载一个巨大的逗号分隔文件,既不能使用 base::read.table,也不能使用sqldf,既不能使用bigmemory也不能使用ff包)。

欢迎任何想法!当然:提前谢谢你。


PS:我曾考虑通过将标准差乘以 1.5 来估计 IQR,但由于分布偏斜,因此该方法不起作用,因此假设正态性不成立。

PS:你认为在 SPSS 中使用 R 不会导致像在纯 R 中打开数据集那样的内存问题吗?

4

2 回答 2

3

这种语法应该可以解决问题。无需专门为此任务在 SPSS 和 R 之间来回迁移。

*making fake data, 4 million records and 150 variables.
input program.
loop i = 1 to 4000000.
end case.
end loop.
end file.
end input program.
dataset name Temp.
execute.

vector X(150).
do repeat X = X1 to X150.
compute X = RV.NORMAL(0,1).
end repeat.

*This is the command you are interested in, puts the stats table into a new dataset.
Dataset declare IQR.
OMS
/SELECT TABLES
/IF SUBTYPES = 'Statistics'
/DESTINATION FORMAT = SAV outfile = 'IQR' VIEWER=NO.
freq var = X1
/format = notable
/ntiles = 4.
OMSEND.

对于如此庞大的数据集,这仍然需要时间,但这是可以预料的。只需在 SPSS 帮助文件中搜索“OMS”即可找到有关 OMS 工作原理的示例语法。


鉴于您要为许多组计算 IQR 的进一步约束,我可以看到几种不同的方法来进行。一种是只使用拆分文件命令并再次运行上述频率命令。

split file by group.
freq var = X1 X2
/format = notable
/ntiles = 4.
split file end.

您还可以在 ctables 中获得特定的百分位数(并且可以为此进行任何分组/嵌套)。不过,此时可能更有用的解决方案是制作一个程序,该程序实际保存单独的文件(或在仍加载的同时减少特定组的完整数据集),对每个单独的文件进行计算并将其转储到数据集中。使用具有 400 万条记录的数据集是一件很痛苦的事情,如果您只是将文件拆分,这似乎没有必要。这可以通过宏命令来完成。

于 2011-04-08T12:37:20.360 回答
2

OMS 可以将任何数据透视表捕获为数据集,因此以这种方式显示的任何统计结果都可以用作数据集。然而,在这种情况下,另一种方法是使用 RANK 命令。RANK 允许对变量进行分组,因此您可以获得组内的排名,并且它可以计算组内的四分位数和百分位数。例如,RANK VARIABLES=salary (A) BY jobcat少数/RANK /NTILES(4) /PERCENT。然后将 FIRST 和组变量聚合为中断将为您提供一个按组的四分位数数据集,从中计算 iqr。

给猫剥皮的多种方法。

——乔恩·派克

于 2011-04-09T01:30:16.473 回答