ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

SPSS自动重新编码:字符串变量转数值与AUTORECODE实战

SPSS自动重新编码:字符串变量转数值与AUTORECODE实战 手头有一份问卷数据性别、城市、行业、学历这几列打开一看全是文字跑多元回归的时候模型里只剩三四个变量明明数据表里躺着二十几列——这是我在帮同事看结果时最常遇到的一幕。SPSS 在做相关分析、回归、聚类、因子分析这些统计过程时只认数值型变量字符串变量会被直接排除在候选列表之外而且它不报错只是安静地把你那些题藏起来新手很容易以为模型本来就长这样。要解决这个问题最省事的路子就是走一遍重新编码里的自动编码功能它能把一列文字取值自动编号成 1、2、3 这样的连续整数同时把原文字挂成值标签几秒钟就还你一列能参与运算的数值变量。这篇内容就是围绕这个功能展开的我会把它的对话框拆开讲透把排序这条最容易被忽略的规则讲明白再补上语法批处理和连续变量分段这两个延伸场景不管你刚装好软件还是已经用了一段时间都能从中找到能直接抄走的东西。1. 自动重新编码到底在解决什么问题1.1 字符串变量被统计过程静默忽略的典型场景先说一个我印象很深的例子。同事拿着一份 400 多份的问卷数据来找我说她的回归模型跑出来 R 方只有 0.12怎么看都不合理。我打开她的变量视图逐列扫了一遍发现问题根本不在模型上她的所在城市所属行业学历这三列数据类型全都是字符串格式。她在做回归时只能选到那些用 1 到 5 录入的李克特量表题因为城市、行业这些文字列压根就没出现在因变量和自变量的候选框里。SPSS 的这类行为有个特点它不是走不通才报错而是从头到尾就不打算让你选。因子分析的变量框、聚类分析的变量框、判别分析的分类框凡是字符串变量一律不显示。你要是指着错误信息找原因会一直找不到因为压根没有错误信息。手动改当然可以。但如果所属行业有三十多个不同取值所在城市有上百个一列一列去找、去替换眼睛都要花而且极容易漏掉或者串行。这种取值种类多、又是文字的变量正是自动重新编码最擅长处理的类型。它做的事可以概括成一句话把一列里的每一个不同取值按某种顺序排好然后从你指定的起始值开始依次发一个号码。1.2 三种重新编码的分工别用错了SPSS 的转换菜单下有四个和重新编码相关的东西功能重叠度高很多人第一次用会随便挑一个结果要么覆盖了原始数据要么做出的新变量顺序一团乱。我按实际用途把它们的分工列一下。功能是否生成新变量原始值是否保留最典型的使用场景重新编码为相同变量否直接覆盖否覆盖后默认无法还原反向计分、把某个值改成缺失重新编码为不同变量是是按你指定的旧值到新值映射做转换自动重新编码是是字符串批量转数字或给唯一值编号可视分箱是是把连续变量按区间切成几段这里有个细节必须点出来重新编码为相同变量是不可逆操作它在语法层面会插入一段RECODE指令旧值一旦被改写就找不回来了除非你手上有原始数据备份。我见过有人为了省事用它把字符串直接改掉改完发现顺序不对想退回只能重新导入数据。而自动重新编码和重新编码为不同变量都生成新变量原变量原封不动地留在数据集里。区别在于重新编码为不同变量需要你一条一条手工写下旧值到新值的映射关系适合取值种类少、顺序有讲究的情况自动重新编码不需要你写任何映射它自己去扫一遍所有取值然后自动编号适合取值种类多、你并不在意具体哪个值对应哪个号的情况。判断标准其实很简单你能不能事先把所有取值列出来能就用重新编码为不同变量不能或者列出来太麻烦就用自动重新编码。2. 对话框里每个选项到底在做什么2.1 输入变量与新名称的绑定关系打开转换 → 自动重新编码你会看到一个很简洁的对话框。左边是数据集里的变量列表中间是数字变量 → 新名称框下面三个按钮分别是新名称、起始值、最大标签宽度右下角还有个选项按钮。整个界面比重新编码为不同变量干净得多因为它不需要你填映射表。操作流程是把左边的变量选进中间的框然后点击新名称按钮SPSS 会弹出一个输入框让你确认新变量叫什么。默认给的名字通常是基于原变量名加一个前缀字符生成的你可以直接改成自己习惯的命名方式。我的习惯是统一加n_前缀比如城市变成n_城市这样在变量列表里按字母排序时所有编码后的数值变量会集中在一起扫一眼就知道哪些是派生出来的。这里有个容易搞混的地方一次可以把多个变量同时放进中间框但每个变量必须有自己的新名称。如果你放进去三个变量却只点了一次新名称SPSS 会按顺序给它们生成三个名字你不一定记得哪个是哪个。变量多的时候我建议一个一个来或者干脆走语法第四章会讲比在对话框里点要清楚得多。另外提醒一点自动重新编码生成的新变量类型是数值型格式是宽度 8、小数位 0。这一点没法在对话框里改如果你后续需要别的小数位设置得去变量视图手动调格式。2.2 起始值和最大标签宽度两个不显眼但有用的按钮起始值这个按钮点开会让你输入一个整数默认是 1。它的作用是决定编号从哪个数字开始。绝大多数场景下用默认的 1 就对了因为 1 开始符合我们对第几个类别的直觉。什么时候会想改成 0如果你的数据后续要扔进某些偏好从 0 开始计数的建模流程或者你需要和另一批已经用 0 起始编码的数据对齐那就可以设成 0。除此之外我没有遇到过必须改起始值的场景绝大多数人保持默认即可。最大标签宽度控制的是新变量的值标签能存多少个字符。自动重新编码的一个贴心之处在于它会把原来的文字值自动挂成新变量的值标签这样你在输出结果里看到的不是3而是3 北京。但如果原来的字符串很长比如华东地区江苏省南京市这种超出宽度的部分会被截断标签就变成半截话。反过来设得太大值标签会占用额外的文件空间数据量大的时候也能感觉出来。我的经验值是设成 40 到 60 之间够覆盖绝大多数城市名、行业名、学历选项又不会浪费太多空间。如果是地址这类超长文本你本来也不该把它当分类变量用那属于另外的处理思路。2.3 选项里的对照表必须留档点开选项按钮里面有一个复选框意思是把新值和旧值的对照表打印出来默认是勾上的。这个默认值千万别去动它。原因很实际自动重新编码最危险的一点就是你不知道它把北京编成了几号。如果没有对照表你后面看到回归系数或者聚类结果的分类标签时只能靠猜。而对照表会以一张表格的形式输出到查看器窗口里格式大概是旧值一列、新值一列你一眼就能看到1 北京、2 上海、3 天津这样的映射关系。我处理过的项目里凡是用过自动编码的我都会把这张表连同语法一起复制到项目记录文档里。理由有两个一是数据分析报告的读者需要知道编码含义二是如果半年后有人要复现你的分析没有这张表新数据编码出来的号码顺序很可能对不上整个结论就崩了。特别是当你的数据来源不止一批后面还要合并的时候这张对照表就是唯一的对账依据。3. 排序规则才是自动编码最大的变量3.1 数值变量和字符串变量走的是两套排序逻辑自动编码最核心的动作就是排序然后发号所以排序规则决定了最终编码长什么样。SPSS 对数值变量和字符串变量的处理逻辑完全不同这一点必须掰开说。对数值变量它按数值大小从小到大排。假如你有一个变量记录了家庭人口数取值是 1、2、3、4、5、6、7、8自动编码后得到的还是 1 到 8看起来像是没变。但如果取值是 2、3、5、8跳过了几个数那编码结果就变成 1、2、3、4。换句话说自动编码会把你原有的数值间隔压平这一步在很多场景下是好事在另一些场景下是灾难。对字符串变量它按字符编码的顺序排不是按中文语义。这就引出了下一节要讲的坑。3.2 中文选项的排序为什么对不上低中高这是我见过最多人踩的坑没有之一。假设你的问卷里有一道题用文字记录满意度取值是非常满意、满意、一般、不满意、非常不满意你想把它转成 5、4、3、2、1 的数值。用自动编码跑一遍结果大概会让你失望SPSS 根本不知道你想让非常满意最大它只是按字符编码把五个词排了个序然后从 1 开始发号。同理如果是一道关于影响程度的题取值是低、中、高你希望编成 1、2、3但自动编码出来的是不是这个顺序完全看字符码跟低中高这个语义顺序未必一致。如果恰好对上了那是运气不是规律。所以自动编码有两个必须遵守的前提第一你并不关心哪个取值对应哪个号只要它们是不同的数字就行第二或者你事后会重新核对对照表发现顺序不对时再动手改。凡是涉及等级、程度、频率、同意度这一类有内在顺序的变量自动编码给出的号码几乎肯定不是你想要的那个顺序出错概率接近百分之百。涉及到多维题项效度分析的时候这个坑更隐蔽。效度分析通常要按维度把题目分组再算各维度得分。如果题目变量原本是文字录入的自动编码把所有维度题目统一转了数字但每个维度内部的顺序可能各不相同你算出来的维度总分就是一堆乱序加总信度效度指标全部失真。我的建议是效度分析、量表计分这类用途题目变量一定要在录入阶段就用数字或者用重新编码为不同变量逐条指定映射不要图快用自动编码。3.3 想控制编码顺序的三种可行做法知道了排序不受控那有没有办法让自动编码听你的话我实测过几种方案各有适用场景。第一种是改造原字符串。比如你的取值是低、中、高你可以先在原变量里把它们改成1低、2中、3高这样字符排序自然就对了。但这个做法有副作用值标签会变成1低这种带数字前缀的奇怪文本报告里不好看而且带数字的字符串排序还要注意位数问题——10会排在2前面。所以如果取值超过 9 个得用0102这种固定宽度的写法。这个方案我不太推荐只在临时分析时用。第二种是自动编码后用重新编码为不同变量二次修正。先让自动编码把文字变成数字拿到对照表然后在重新编码为不同变量里按你想要的顺序把旧编号映射成新编号。这个方法步骤多但可控性最强而且每一步都有记录可复现。我处理正式项目时基本都走这条路。第三种是直接放弃自动编码用重新编码为不同变量。如果变量只有三五个取值手工写映射其实比走两遍自动编码更快。判断标准还是那句取值数量少就手工多就自动加二次修正。方案适用场景主要缺点改造原字符串临时分析、取值少值标签难看位数有陷阱自动编码 二次修正取值多的正式项目步骤多需要留档直接用重新编码为不同变量取值少、顺序要求明确取值多时工作量大4. 把自动编码交给语法AUTORECODE 与 /GROUP4.1 AUTORECODE 命令的基本结构对话框点几十次不如写一行语法尤其是要处理的变量多、又要反复重来的时候。自动编码对应的命令是AUTORECODE基本骨架如下。AUTORECODE VARIABLES城市 /INTO n_城市 /PRINT.VARIABLES后面跟要编码的原变量/INTO后面跟新变量名两个列表的变量个数必须一一对应顺序也不能错。/PRINT就是那个打印对照表的选项建议每次都带上它会让对照表出现在输出窗口里。我个人的习惯是先点一次对话框按下粘贴按钮把生成的语法复制到语法窗口里然后在这个基础上改。这样做的好处是参数的写法绝对不会记错而且你能清楚地看到 SPSS 在背后到底做了什么。语法方式最直接的好处是可复现。对话框操作是一次性的你今天点了明天别人拿到你的数据文件不知道你当时是怎么编的。而一段语法加上一张对照表别人重跑一遍能拿到完全一样的结果。研究类项目尤其要注意这一点数据处理的每一步都应该有语法留痕。4.2 /GROUP 让同一个值跨变量共享编码这是 AUTORECODE 里最有价值、也最少被人用到的一个子命令。默认情况下多个变量是一起编码但每个变量各自编各自的号。举个例子你有三道多选题选项变量取值都是是否默认编码后三个变量都会得到 1 和 2看起来没问题。但如果三道题的选项是A 选项B 选项C 选项而不同题出现的选项组合不一样默认编码下每道题的A 选项可能是 1也可能是 2取决于这道题里还有哪些选项参与了排序。这样编码出来的变量之间就失去了可比性。加上/GROUP之后SPSS 会把VARIABLES里列出的所有变量当成一个整体来排序编码同一个取值在所有变量里拿到相同的号码。这个特性对多选题拆分出来的变量组特别有用因为多选题在数据里通常是一题拆成好几个变量选项值保持一致才能做后续的频数统计和交叉分析。AUTORECODE VARIABLES选项1 选项2 选项3 选项4 /INTO n_选项1 n_选项2 n_选项3 n_选项4 /GROUP /PRINT.用之前务必确认这几个变量的取值域确实是有交集的也就是它们本来就应该共享一套编码。如果两个变量风马牛不相及比如一个是行业一个是学历你硬用/GROUP把它们编到一套号码里结果会非常混乱。这个子命令只在同一套选项在不同变量里重复出现的场景下才有意义。4.3 一次处理几十个题目的批量写法量表的题目动辄二三十道一题一题点对话框是不现实的。语法方式在批量处理上有天然优势因为变量列表可以一次性列完。假如你有 Q1 到 Q30 共三十道题全是字符串录入的选项可以这样写。AUTORECODE VARIABLESQ1 TO Q30 /INTO n_Q1 TO n_Q30 /GROUP /PRINT.这里用到了 SPSS 的变量区间写法TO前提是这些变量在数据文件里的排列顺序是连续的中间没有别的变量插进来。如果顺序不连续就得老老实实把名字列全。编码完成后我通常还会顺手加一段VARIABLE LABELS和VALUE LABELS或者至少跑一下FREQUENCIES看一眼每个新变量的分布确认没有出现意料之外的编码。有一点要提前想到/GROUP用在三十道量表题上前提是所有题共用同一套选项比如都是五级同意度。如果题型混着有的五级有的七级分组编码会把它们强行统一到同一个号码区间这就不对了。所以批量处理之前先按题型把变量分成几组每组单独跑一次 AUTORECODE。5. 自动编码做不到的事连续变量分段5.1 为什么不能让自动编码给连续变量分组有人会想既然自动编码能把值变成 1、2、3那我把年龄直接自动编码一下不就得到年龄组了吗这个想法很自然但结果会让你失望。自动编码对数值变量的处理方式是每一个不同的数值给一个编号。年龄从 18 到 65一共 48 个不同的值自动编码就会生成 1 到 48 共 48 个编码每个编码对应的还是原来那个具体年龄。这既没有减少类别数量也没有完成分组只是把数字换了一层皮。你想要的是18-25、26-35、36-45这样的三四个区间这是分箱的活不是自动编码的活。这个坑的迷惑性在于自动编码跑完之后变量看起来确实是数值型的检查程序也不会报错但语义上完全不是你要的东西。我见过有人拿自动编码处理过的年龄变量去做交叉表结果输出了一张密密麻麻几十行的表才意识到哪里不对。5.2 可视分箱的做法与分界点设定连续变量分段正确的工具是转换 → 可视分箱。它的思路很直观打开之后SPSS 会扫描这个变量的最小值、最大值和分布给你一个建议的分箱方案你可以在此基础上调整分界点。分界点的设置有两种方式一种是按等宽切比如每 10 岁一段另一种是按分位数切比如按四分位把样本等分成四组。两种方式适用的场景不同。等宽分箱的好处是每段的数值跨度一样解释起来简单但如果数据分布严重偏斜某一段可能只有几个人交叉表里会出现空单元格。等分位数分箱的好处是每段人数大致均衡交叉表更稳定缺点是每段的区间宽度不一样解释时要额外说明。我处理收入、年龄这类偏斜变量时更倾向分位数分箱处理评分、时长这类分布相对均匀的变量时用等宽就够。可视分箱还有一个很贴心的功能它会生成一段RECODE语法你可以把这套分界点原封不动地套用到新一批数据上。这一点在做纵向对比的时候非常关键——如果两批数据各自按分位数切切出来的区间是不一样的根本没法比较。5.3 分段结果怎么验证分箱做完别急着往下跑花两分钟验证一下。最直接的办法是对新旧两个变量做一次交叉表行是老变量分段前的原始值列是新变量看看有没有落在分段区间之外的值或者分界点附近有没有被错误归类的个案。还有一点分箱的区间边界是闭区间还是开区间SPSS 会明确显示在语法里比如(18 THRU 25)和(25 THRU 35)在 25 这个点上谁来接需要你仔细核对。这类边界处理在工资、年龄、成绩这类恰好卡在整数点的数据上特别容易出问题我一般会把分界点选在零点几的位置比如 25.5避开整数歧义。如果分段是为了之后做聚类分析还要注意一点K-means 这类算法只接受连续变量你分好箱的类别变量硬塞进去会被当作有序数量处理语义是错的。类别变量应该走两步聚类或者先做多重对应分析降维再用聚类。这个问题我在后面还会再提一句。6. 实操里最容易忽略的几个细节6.1 缺失值和空字符串会被编成第几个值缺失值在自动编码里的行为需要特别留意。数值变量的系统缺失值一般不会参与编号新变量对应位置仍然是缺失。但字符串变量里的空白、空格、空字符串这类看起来是空的其实有内容的值处理起来就没那么规范了它可能被当成一个正常取值参与排序拿到一个编码也有可能被跳过具体行为跟数据的实际存储方式有关。所以编码完成之后第一件事是对新变量跑一次频数看看编码的分布是否合理。如果出现了你预料之外的编码或者某个编码的个案数异常地多多半就是缺失值或者空白值在作怪。发现之后用重新编码为不同变量把这些异常编码统一设为系统缺失就行。还有一种隐性的缺失录入阶段有人用了中文全角的空格有人用了半角空格有人什么都没填。这三个在 SPSS 眼里是完全不同的三个值会被编成三个码。处理这种脏数据最好在编码之前用计算变量配合字符串函数先做一遍清洗把空白类取值统一成真正的缺失。6.2 数据分拆、多重插补合并后的编码一致性数据分拆文件是个容易被误解的功能。分拆只影响之后的统计输出按组分层展示不会让自动编码按组各编一套号。也就是说编码动作是在整个数据文件上统一执行的如果你希望不同子集各自独立编码那得先把数据拆成独立文件分别处理再合并回来同时接受两套编码体系不兼容的后果。多重插补合并的场景更需要注意。插补生成的是多个数据集最后合并成一个结果。如果原始数据里的分类变量是字符串格式插补过程中通常需要它是数值或者因子形式。正确的顺序是先把字符串变量用自动编码转成数值并确认对照表再进行插补或者统一在插补之后的合并结果上做一次编码。千万不要在每一个插补数据集上各跑一遍自动编码因为不同数据集里的取值出现顺序可能不同编出来的号码就对不上了合并后变量含义会彻底乱掉。这条经验是我在做一个纵向追踪项目时踩出来的。当时五个插补数据集各自编码后再合并结果华东在一个数据集里是 2在另一个里是 3合并后的分析全错。后来改成先在原始数据上编码、留好对照表再整批去插补问题就没了。6.3 编码之后别急着扔进模型自动编码完成的变量虽然披着数值的外衣语义上它仍然是分类变量不是连续变量。这一点决定了你后面能拿它做什么。做描述统计、交叉表、卡方检验没问题。做聚类分析的两步聚类、做判别分析也没问题。但如果你直接把它扔进 Pearson 相关分析或者线性回归SPSS 不会拦你它会把编码后的数字当成真实的数值参与运算出来的系数在数学上有意义在业务解释上毫无意义——你没法说城市编码每增加 1收入平均增加多少。如果确实想把分类变量纳入回归正确做法是把它作为哑变量处理在广义线性模型或者逻辑回归的分类按钮里指定它是分类变量SPSS 会自动帮你拆成对比变量。这一点很关键很多人把类别变量编码后直接当连续变量用模型看起来能跑报告交上去被质疑的时候才发现问题。同理相关性分析里如果变量是分类的应该看 Spearman 等级相关或者用卡方检验不要用 Pearson。这个判断在数据处理的每一步都值得问自己一遍我手上这一列数字它代表的到底是数量还是标签最后分享一个我自己的做法。每次做完自动编码我会在数据集里保留三个东西原字符串变量、编码后的数值变量、以及一张写在语法文件注释里的对照表。原变量占不了多少空间但它是我在结果解释阶段唯一能对上号的依据。等报告定稿、数据交付之后再决定要不要清理。这套习惯让我在后面回头修改分析的时候省了很多次重跑的功夫也避免了把编码顺序记错这种低级但致命的错误。
返回列表