【问题标题】:How to aggregate on IQR in SPSS?如何在SPSS中聚合IQR?
【发布时间】:2011-04-07 23:11:10
【问题描述】:

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

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

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

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


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

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

【问题讨论】:

  • 您可以访问传统数据库吗?如果是这样,您可以将中位数的数据分成两组,然后找到 75% 和 25% 百分位数的高组和低组的中位数,这将为您提供 IQR。
  • 谢谢@Chase!我会调查你的建议。尽管我不明白您所说的“传统数据库”是什么意思,但我担心拆分文件并非易事。我想通过一个包含大约 2000 个类别的变量来聚合文件,因此生成的矩阵将包含大约 2000 个包含所有聚合变量的案例。通过将文件一分为二并计算两组的中位数,需要计算所有中断变量类别中连续变量的中位数,将文件拆分为 2 次 2000 个文件并再次计算中位数。似乎很棘手,但我可能不明白这一点:)
  • 对不起,我应该说关系数据库,即Microsoft SQL或MySQL等。大多数关系数据库允许您直接读取平面文件。但是 - 在阅读了您的最后一条评论后,我认为这可能不是最好的方法。
  • 查看 OMS 系统。您可以在将统计信息表导出到数据集时运行命令来生成统计信息。
  • 您是否将 colClasses 指定为 read.table?指定 nrows 也可能有帮助。两者都有助于减少加载数据所需的内存开销。它的加载速度也快得多!

标签: r aggregate spss iqr


【解决方案1】:

这种语法应该可以解决问题。无需专门为此任务在 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 命令并再次运行上述频率命令。

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

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

【讨论】:

  • 请注意,我的内存在尝试同时对所有 150 个变量运行时超出了内存,但在仅指定一个变量时却没有。
  • 非常感谢,我想我明白了将描述保存在新数据库中的意义——它看起来真的很有用!我唯一的问题是我无法弄清楚如何使用中断变量来执行此操作(因为我想通过那个进行聚合),所以要获得一个包含这些值的数据库,但对于中断变量的每个类别(大约 2000 个类别) .我看到我可以通过过滤给定类别的案例来循环执行此操作(从 1 到 ~2000 重复),但这会导致一堆文件。你知道如何改进你的答案吗?再次感谢,你绝对值得投票。
  • 抱歉回复晚了,我在用 OMS“玩”了很多次(除了很多其他的东西)来测试这个方法。虽然 OMS 看起来非常好,但定期拆分这么大的文件 真的很耗资源 - 语法只为一个变量运行了两天 :) 所以我会接受 @JKP 的建议,这似乎与 OMS/拆分相比非常快,所以复选标记在那里。无论如何:非常感谢您非常为您提供真正的帮助,也感谢您将我的注意力指向 OMS!
【解决方案2】:

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

给猫剥皮的多种方法。

-乔恩·派克

【讨论】:

  • 非常感谢您提供这个非常聪明的答案,这似乎很快解决了我的问题 - 基于一些简短的实验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多