如何在Stata中基于多分类变量组合生成技术评分变量并排序?
技术评分变量生成与分组代码验证
一、加权总分生成代码的合理性验证
语法与逻辑分析
你提供的gen代码核心逻辑是通过加权求和生成企业技术重要性总分,符合调研中按权重(6-1)计算评分的需求,但存在明显语法错误:
gen tecscore= Tq13q145G*6 +Tq13q14Robatics*5+ Tq13q14bigdata*4+ Tq13q14AI*3+ Tq13q14INTOT*2+( Tq13q14cloud+ Tq13q14Blockchain Tq13q14DataStech+ Tq13q14Machinelearning +Tq13q14Predictivedata Tq13q14Datasecurity +Tq13q14Tools +Tq13q14EdgeCompute+ Tq13q14BioNano Tq13q14Augmentedreality+ Tq13q14Quantum)*1
- 错误点:多个变量间缺失加号(
+),例如Tq13q14Blockchain与Tq13q14DataStech之间、Tq13q14Predictivedata与Tq13q14Datasecurity之间、Tq13q14BioNano与Tq13q14Augmentedreality之间均无运算符,Stata会将其识别为无效变量名,直接报错。 - 修正后的代码示例:
gen tecscore= Tq13q145G*6 + Tq13q14Robatics*5 + Tq13q14bigdata*4 + Tq13q14AI*3 + Tq13q14INTOT*2 + (Tq13q14cloud + Tq13q14Blockchain + Tq13q14DataStech + Tq13q14Machinelearning + Tq13q14Predictivedata + Tq13q14Datasecurity + Tq13q14Tools + Tq13q14EdgeCompute + Tq13q14BioNano + Tq13q14Augmentedreality + Tq13q14Quantum)*1
分类变量组合生成新变量的可行性
完全可以通过q13与q14的交叉组合生成分组变量,再基于分组计算技术评分,常见场景包括:
- 若需在q13-q14交叉组内计算技术总分,可使用
bysort前缀:bysort q13 q14: gen tecscore_group = Tq13q145G*6 + ... + (其余12项技术求和)*1 - 若需将交叉组合作为单独变量,可先生成交叉分组标识:
gen q13q14 = q13*10 + q14 // 生成15种联合取值的标识变量 bysort q13q14: gen tecscore_by_group = ... // 基于交叉组计算总分
二、分组排序代码的问题与修正
egen group()代码的错误
你提供的egen代码存在逻辑与语法双重错误:
egen tecscore= group( Tq13q145G*6 Tq13q14Robatics*5 Tq13q14bigdata*4 Tq13q14AI*3 Tq13q14INTOT*2 Tq13q14cloud Tq13q14Blockchain Tq13q14DataStech Tq13q14Machinelearning Tq13q14Predictivedata Tq13q14Datasecurity Tq13q14Tools Tq13q14EdgeCompute Tq13q14BioNano Tq13q14Augmentedreality Tq13q14Quantum), missing label
group()函数的参数只能是原始变量名,不能是变量运算表达式(如Tq13q145G*6),Stata会将这类表达式识别为不存在的变量,直接报错。- 该代码的意图若为将16项技术的取值组合划分为不同组别,逻辑上会生成大量组别(远多于15种交叉分组),与调研需求不符。
是否需要先分组再排序?
需根据你的分析目标判断:
- 若需在q13-q14交叉组内对技术总分排序:无需提前用
group()分组,直接用bysort结合rank()函数即可:// 先计算技术总分(修正后的gen代码) gen tecscore= ... // 在q13-q14交叉组内对tecscore排序,生成排名变量 bysort q13 q14: gen tec_rank = rank(tecscore) - 若需将技术总分划分为若干组别(如分位数组):可使用
xtile或egen cut,而非group():// 将tecscore分为5个等分组 xtile tec_group = tecscore, nq(5) // 或用egen cut自定义分组阈值 egen tec_group_cut = cut(tecscore), at(0,20,40,60,80,100)
内容的提问来源于stack exchange,提问作者Fab Taba
相关产品推荐
相关产品推荐

