You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)
))

问题原因与解决方法

错误根源

  1. 目标结构不符合要求:anesrake要求target列表的每个元素是带命名的数值向量,命名要和数据集中因子的水平完全对应。你直接把普通数值向量放进列表后,试图给它添加levels属性——这是错误的,普通数值向量没有levels,强行赋值会导致函数无法识别目标比例的对应关系,触发类型错误。
  2. 缺少必要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:57:01