如何使用FertBoot::f.linear.plateau处理嵌套数据获取线性平台函数系数?
问题:FertBoot分组嵌套调用f.linear.plateau函数报错
我使用FertBoot包的f.quad、f.quad.plateau和f.linear.plateau函数,为不同数据集计算二次函数、二次平台函数及线性平台函数的系数。直接对整个数据集调用f.linear.plateau可正常运行,但按group字段分组嵌套数据后调用该函数出现错误,且该错误未在f.quad和f.quad.plateau函数中出现。
错误信息
Error in `mutate()`: ℹ In argument: `LP = map(data, ~f.linear.plateau(d = .))`. ℹ In group 1: `group = "a"`. Caused by error in `map()`: ℹ In index: 1. Caused by error in `model.frame.default()`: ! invalid type (list) for variable 'd[, 2]' Backtrace: 1. df %>% group_by(group) %>% nest() %>% ... 9. purrr::map(data, ~f.linear.plateau(d = .)) 10. purrr:::map_("list", .x, .f, ..., .progress = .progress) 14. .f(.x[[i]], ...) 15. FertBoot::f.linear.plateau(d = .) 20. stats::model.frame.default(formula = d[, 2] ~ d[, 1], drop.unused.levels = TRUE)
复现代码
library(tidyverse) library(FertBoot) df <- data.frame( x = 0:200 ) %>% mutate( a = -0.003*x^2+x+30, b = -0.0029*x^2+x+25, c = -0.004*x^2+1.2*x+20 ) %>% gather( a,b,c, key=group, value = y ) #%>% #dplyr:: select(-group) #result <- f.linear.plateau(df) result <- df %>% group_by(group) %>% nest() %>% mutate( Q = map( data, ~f.quad(d=.) ), QP = map( data, ~f.quad.plateau(d=.) ), LP = map( data, ~f.linear.plateau(d=.) ) )
解决方案
问题根源
f.linear.plateau函数内部通过d[,2] ~ d[,1]的方式构建模型公式,但嵌套后的data子对象是包含x和y的数据框,函数无法正确识别数据框的索引操作;而f.quad和f.quad.plateau内部可能做了数据框到矩阵的自动转换,因此未出现报错。
修复代码
调用f.linear.plateau时,将嵌套的子数据框转换为矩阵(FertBoot函数通常接受矩阵输入,第一列为自变量,第二列为因变量):
result <- df %>% group_by(group) %>% nest() %>% mutate( Q = map(data, ~f.quad(d=.)), QP = map(data, ~f.quad.plateau(d=.)), LP = map(data, ~f.linear.plateau(d = as.matrix(.x))) )
也可以明确指定列来确保输入格式正确:
LP = map(data, ~f.linear.plateau(d = select(.x, x, y)))
两种方式都能解决索引识别错误的问题,让函数正常运行。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

