SPSS LAG 函数:用途与详解

SPSS 中,LAG 函数用于返回前一个个案的值。它主要用于每个受访者有多行数据的数据集。在这种情况下,它对于计算累计总和或计数非常有用。

SPSS Lag Function

SPSS LAG - 基础示例 1

使用 LAG 最基本的方法是 COMPUTE V1 = LAG(V2)。 这将简单地计算一个(可能是新的)变量 V1,其中包含 V2 上前一个个案的值。第一个屏幕截图说明了这一点。 它是运行以下 语法 的结果。由于第一个个案没有前一个个案,因此新变量上会有一个 系统缺失值

SPSS LAG 语法示例 1

***1. 创建数据.
**
data list free / id.
begin data
1 2 2 3 3 3 4 4 4 4
end data.

***2. 查找前一个个案的 id 值.
**
compute previous_id = lag(id).
exe.

SPSS LAG - 创建计数器

说明 LAG 如何工作的一个好方法是创建一个计数器变量。 对于每个 id 值,我们将创建一个变量,指示其数据的第 n 行。 我们将首先使用 [IF](/spss-if-command) 命令识别每个 id 的第一个记录,如下面的语法所示。 屏幕截图说明了它的工作原理。

***对于每个 id 的第一行,counter = 1.
**
if $casenum = 1 or id ne lag(id) counter = 1.
exe.

SPSS LAG Function Example 识别每个 id 值的首行

接下来,我们将完成我们的计数器。 这里需要理解的重要一点是,当 SPSS 执行数据转换时,个案会从上到下按顺序处理。 也就是说,SPSS 将从 $casenum = 1 开始,然后逐个个案地向下处理。 因此,在此过程中由 LAG 创建的值可能会被下一个个案使用。 下面的屏幕截图说明了 SPSS 处理以下语法时发生的三个步骤。 由于这些步骤通常需要几毫秒才能完成,因此您实际上看不到它们在正常情况下发生。

***2. 对于每个后续行,将计数器加 1.
**
if sysmis(counter) counter = lag(counter) + 1.
exe.

SPSS LAG Function Result SPSS 从上到下按顺序处理个案

SPSS 长数据格式 (Long Data Format)

SPSS Long Data Format SPSS 长数据格式。 注意每个客户可以有一个或多个记录。

我们将继续使用实际示例,这些示例的级别会逐渐提高。 假设我们有以记录形式保存订单的数据,如上图所示。 请注意,每个客户可以有一行或多行数据。 这种格式通常称为 长数据格式 (long data format)。 与此相反,每个客户的数据位于一行上,称为 宽数据格式 (wide data format)。 关于这些数据的相关问题可能是:

  1. 客户多久下一次订单? 或者,一个客户的订单之间间隔多少天?
  2. 平均每个客户下多少订单?
  3. 客户花费多少钱?

我们将使用 LAG 函数来解答这些问题。

SPSS LAG 示例 - 订单之间的天数

运行以下语法将创建上一个屏幕截图中的数据,并找到一个客户的订单之间的天数。 请注意,必须首先以有意义的方式对记录进行排序。 接下来,if customer_id = lag(customer_id) 检查每个记录是否 不是 给定客户的第一个记录。 仅对于这些记录,才会计算 days_between_orders

SPSS LAG 语法示例 2

***1. 创建测试数据.
**
data list free / order_id (f2.0) order_date(edate10) customer_id invoice_amount (2f3.0).
begin data
1 26.09.2011 8 100 2 30.10.2011 8 100 3 28.12.2011 3 100 4 21.01.2012 12 150 5 26.01.2012 3 110
6 31.01.2012 7 140 7 16.02.2012 12 190 8 22.02.2012 12 30 9 23.02.2012 3 150 10 04.04.2012 12 50
end data.

***2. 按 customer_id 和 order_date 对记录进行排序.
**
sort cases customer_id order_date.

***3. 计算单个客户的订单之间的天数.
**
if customer_id = lag(customer_id) days_between_orders = datediff(order_date,lag(order_date),'days').
exe.

SPSS LAG 示例 - 每个客户的累计订单

现在,我们将创建一个每个客户的累计订单计数。 我们将首先将这个新变量设置为每个客户的第一个记录的 1。 这是通过 if $casenum = 1 or lag(customer_id) ne customer_id 选择的。 接下来,如果每个连续记录属于同一客户,我们将对其加 1。 此条件由 if customer_id = lag(customer_id) 暗示。 请注意,我们利用了 SUM(SYSTEM MISSING,X) = X 这一事实。 我们不能在此处使用 + 运算符,因为 SYSTEM MISSING + X = SYSTEM MISSING

SPSS LAG 语法示例 3

***1. 对于每个 customer_id 的第一条记录,cumulative_orders = 1.
**
if $casenum = 1 or lag(customer_id) ne customer_id cumulative_orders = 1.
exe.

***2. 对于每个连续记录,将 cumulative_orders 加 1.
**
if customer_id = lag(customer_id) cumulative_orders = sum(lag(cumulative_orders),1).
exe.

SPSS LAG 示例 - 累计支出

最后,我们将创建累计支出。 这与前面的示例非常相似。 我们现在不是将 1 添加到每个连续记录,而是添加 invoice_amount

SPSS LAG 语法示例 4

***1. 对于每个 customer_id 的第一条记录,cumulative_amount = invoice_amount.
**
if $casenum = 1 or lag(customer_id) ne customer_id cumulative_amount = invoice_amount.
exe.

***2. 第二条到第 n 条记录的累计金额.
**
if customer_id = lag(customer_id) cumulative_amount = sum(invoice_amount,lag(cumulative_amount)).
exe.

SPSS Lag Function Result 原始变量和使用 LAG 创建的变量

注意事项

  • 根据经验,在使用 LAG 的命令之后,始终立即运行 EXECUTE。 这是您真正需要运行 EXECUTE 或过程的极少数情况之一。 这样做的原因是相当技术性的,但对于那些想知道的人:LAG 总是在所有其他转换之后执行。 这意味着命令的执行顺序可能与指定它们的顺序不同。 因此,如果在后续命令中使用受 LAG 影响的变量,则后者很可能使用“错误”的值,因为 LAG 尚未发生。
  • 为了获得第 n 个前一个个案的值,请使用 LAG(...,n)。 请注意,n 必须是正整数。 也就是说,您不能使用 LAG(v1,-1)下一个 个案而不是上一个个案获取值。

从下一个个案获取值

  • LAG 不能轻易地从下一个个案而不是上一个个案访问值。 如果您确实需要下一个个案的值,一种选择是反转个案的顺序并仍然使用 LAG
  • 您还可以使用 CREATESHIFT VALUES 从下一个个案获取值。 请注意,这些是过程(而不是函数)。 这意味着您不能在 IF 命令中使用它们来评估条件,就像我们在本教程中讨论的大多数示例中所做的那样。

其他示例

在编写本教程后不久,我们收到了一些更具挑战性的问题,这些问题主要通过使用 LAG[IF](/spss-if-command) 语句来解决。 我们将在下面逐步介绍它们。

SPSS Lag - 识别会话

“我们进行了一项实验,其中向受访者展示了随机图片。 每张图片可能会或可能不会重复出现。 单个图片的后续演示构成一个 会话 (session)。 我们如何将会话添加到我们的数据中?”

下面的语法侧重于逐步解释事物的运作方式。 这不是回答问题的最快选择。 有关缩短它的方法之一,请参阅 Compute A = B = C

SPSS LAG 语法示例 5

***1. 创建数据.
**
data list free / sequence id picture.
begin data.
1 1 1 2 1 4 3 1 3 4 1 4 5 1 4 6 1 4 7 1 1 8 1 1 9 1 3 10 1 3 1 2 3 2 2 3 3 2 3
4 2 4 5 2 2 6 2 4 7 2
1 8 2 2 9 2 3 10 2 1 3 1 2 3 3 3 3 3 4 3 4 5 3 4 6 3 2 7 3 1 8 3 4 9 3 3 10
3 3
end data.

variable labels id 'Respondent id'.

***.2 对于每个受访者的第一行数据,Session = 1.
**
if $casenum eq 1 or id ne lag(id) session = 1.
exe.

***3. 检测切换(同一受访者的不同图片).
**
if $casenum gt 1 and id eq lag(id) and picture ne lag(picture) switch = 1.
exe.

***4. 每次切换时,将会话数加 1.
**
if $casenum ne 1 and id eq lag(id) session = sum(lag(session),switch).
exe.

***5. 可选,删除 "switch".
**
delete variables switch.

SPSS Lag - 统计家庭中的选票

“我们收集了关于家庭中不同人的数据。 我们的一个变量 vote 是每个受访者在被问及时会投票支持的政党。 我们想通过计算 vote 上不同值的数量来估计家庭的政治异质性。 我们该怎么做?”

请注意步骤 6 中 [AGGREGATE](/spss-aggregate-command) 的使用。 与前面的示例一样,此语法可以缩短。

SPSS LAG 语法示例 6

***1. 创建数据.
**
data list free / household_member household vote.
begin data
1 1 4 1 2 3 2 2 3 3 2 1 4 2 1 5 2 4 1 3 3 2 3 4 1 4 1 2 4 4 1 5 2 2 5 2 3 5 3
4 5 4 5 5 1
end data.

***2. 按家庭,然后按投票排序.
**
sort cases by household vote.

***3. 对于家庭的第一个成员,counter = 1.
**
if $casenum = 1 or household ne lag(household) counter = 1.
exe.

***4. 识别切换(家庭内的投票变化).
**
if $casenum ne 1 and household = lag(household) and vote ne lag(vote) switch = 1.
exe.

***5. 每次切换时,将计数器加 1.
**
if $casenum ne 1 and household = lag(household) counter = sum(lag(counter),switch).
exe.

***6. 家庭中不同的选票 = max(counter).
**
aggregate outfile = * mode addvariables
/break household
/different_votes_in_household = max(counter).

***7. 可选删除临时帮助变量.
**
delete variables counter switch.