使用anesrake包时出现‘非数值参数传入二元运算符’错误排查
耙样模型自定义目标比例报错问题
我想给耙样模型做个示例,但代码跑不起来——之前同样的操作是正常的,检查了数据类和结构也没找到问题。代码里自定义了leeftijd(c(0.35, 0.40, 0.25))和school(c(0.20, 0.30, 0.35, 0.15))的目标比例,构建dat数据集并转成因子类型后设置了target列表,调用anesrake函数时触发错误:Error: non-numeric argument to binary operator。用wpct生成目标权重能运行,但结果不是我要的数值,想知道为什么自定义的目标比例没法正常工作。
错误代码
require(pacman) p_load(tidyverse, anesrake, weights, purrr) leeftijd <- c(0.35, 0.40, 0.25) school <- c(0.20, 0.30, 0.35, 0.15) dat <- data.frame(leeftijd = c('jong', 'middel', 'oud', 'jong', 'middel', 'oud', 'jong', 'middel', 'oud', 'jong', 'middel', 'oud'), school = c('mbo1-2','mbo1-2','mbo1-2', 'mbo3-4','mbo3-4','mbo3-4', 'hbo','hbo','hbo', 'wo','wo','wo'), perc = c(0.06,0.06,0.03, 0.08,0.10,0.10, 0.9,0.10,0.9, 0.03,0.14,0.08)) dat$leeftijd <- as.factor(dat$leeftijd) dat$school <- as.factor(dat$school) target <- list(leeftijd, school) names(target) <- c("leeftijd", "school") levels(target$leeftijd) <- c('jong', 'middel', 'oud') levels(target$school) <- c('mbo1-2', 'mbo3-4', 'hbo', 'wo') raking <- anesrake(target, dat, dat$caseid, cap = 10, choosemethod = "total", type = "pctlim", pctlim = 0.05 )
可运行但结果不符合需求的代码
target <- with(dat, list( leeftijd = wpct(leeftijd, perc), school = wpct(school, perc) ))
问题原因与解决方法
错误根源
- 目标结构不符合要求:
anesrake要求target列表的每个元素是带命名的数值向量,命名要和数据集中因子的水平完全对应。你直接把普通数值向量放进列表后,试图给它添加levels属性——这是错误的,普通数值向量没有levels,强行赋值会导致函数无法识别目标比例的对应关系,触发类型错误。 - 缺少必要的
caseid列:调用anesrake时指定了dat$caseid,但你的dat数据集里根本没有这个唯一标识列,这也是潜在的报错点。
修正后的代码
require(pacman) p_load(tidyverse, anesrake, weights, purrr) # 给目标比例向量命名,对应dat中因子的水平 leeftijd_target <- c(jong = 0.35, middel = 0.40, oud = 0.25) school_target <- c(`mbo1-2` = 0.20, `mbo3-4` = 0.30, hbo = 0.35, wo = 0.15) dat <- data.frame(leeftijd = c('jong', 'middel', 'oud', 'jong', 'middel', 'oud', 'jong', 'middel', 'oud', 'jong', 'middel', 'oud'), school = c('mbo1-2','mbo1-2','mbo1-2', 'mbo3-4','mbo3-4','mbo3-4', 'hbo','hbo','hbo', 'wo','wo','wo'), perc = c(0.06,0.06,0.03, 0.08,0.10,0.10, 0.9,0.10,0.9, 0.03,0.14,0.08)) dat$leeftijd <- as.factor(dat$leeftijd) dat$school <- as.factor(dat$school) # 添加caseid列(必须,用于唯一标识每一行) dat$caseid <- 1:nrow(dat) # 构建符合要求的target列表 target <- list(leeftijd = leeftijd_target, school = school_target) # 调用anesrake raking <- anesrake(target, dat, dat$caseid, cap = 10, choosemethod = "total", type = "pctlim", pctlim = 0.05 ) # 查看结果 summary(raking)
说明
- 命名后的目标向量会直接和数据集中的因子水平匹配,不需要手动设置
levels。 - 添加
caseid列是anesrake的硬性要求,用于跟踪每一行的权重计算。 - 运行后通过
summary(raking)可以看到,耙样后的比例会匹配你自定义的目标值,而不是wpct生成的基于现有数据的比例。
内容的提问来源于stack exchange,提问作者Myrthe Kroes
相关产品推荐
相关产品推荐

