使用netdiffuseR拟合Bass模型报错:'language'无法转为double类型
问题:使用netdiffuseR拟合Bass模型时出现类型转换错误
运行代码时出现如下错误:
Error in storage.mode(temp) <- "double" : 'language' object cannot be coerced to type 'double
复现代码
library(netdiffuseR) # 示例数据框 test_data <- data.frame(Time=c(2007,2008,2009,2010,2011,2012,2013,2014,2015,2016), dat=c(5054,12221,22468,34817,51670,70800,94736,123650,159982,206830)) # 尝试拟合Bass模型 test_fit <- fitbass(dat ~ Time, data = test_data)
环境信息
> sessionInfo() R version 4.2.2 (2022-10-31 ucrt) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 22621) Matrix products: default locale: [1] LC_COLLATE=English_United States.utf8 LC_CTYPE=English_United States.utf8 LC_MONETARY=English_United States.utf8 [4] LC_NUMERIC=C LC_TIME=English_United States.utf8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] netdiffuseR_1.22.5 loaded via a namespace (and not attached): [1] Rcpp_1.0.9 sna_2.7 pillar_1.8.1 compiler_4.2.2 tools_4.2.2 bit_4.0.5 [7] boot_1.3-28 MatchIt_4.5.0 lifecycle_1.0.3 tibble_3.1.8 lattice_0.20-45 viridisLite_0.4.1 [13] pkgconfig_2.0.3 rlang_1.0.6 Matrix_1.5-3 igraph_1.3.5 DBI_1.1.3 cli_3.4.1 [19] rstudioapi_0.14 parallel_4.2.2 SparseM_1.81 coda_0.19-4 withr_2.5.0 generics_0.1.3 [25] vctrs_0.5.1 hms_1.1.2 networkDynamic_0.11.2 bit64_4.0.5 grid_4.2.2 tidyselect_1.2.0 [31] glue_1.6.2 R6_2.5.1 fansi_1.0.3 vroom_1.6.0 tzdb_0.3.0 magrittr_2.0.3 [37] backports_1.4.1 ellipsis_0.3.2 MASS_7.3-58.1 assertthat_0.2.1 utf8_1.2.2 network_1.18.0 [43] crayon_1.5.2 statnet.common_4.7.0
解答
问题出在fitbass函数的调用方式错误,它不支持dat ~ Time这种公式语法,需要直接传入累计采用量的向量,以及从0开始计数的时间索引。另外你的dat列是年度新增采用数,而Bass模型需要的是累计采用数,这也是必须修正的点。
修正步骤及代码:
library(netdiffuseR) # 示例数据框 test_data <- data.frame(Time=c(2007,2008,2009,2010,2011,2012,2013,2014,2015,2016), dat=c(5054,12221,22468,34817,51670,70800,94736,123650,159982,206830)) # 1. 计算累计采用数 test_data$cum_dat <- cumsum(test_data$dat) # 2. 创建从0开始的时间索引(Bass模型默认时间起点为0) test_data$t <- 0:(nrow(test_data)-1) # 3. 正确拟合Bass模型 test_fit <- fitbass(test_data$cum_dat, t = test_data$t) # 查看拟合结果 summary(test_fit)
关键说明
fitbass的第一个参数必须是累计采用量的数值向量,不支持公式传入形式t参数需要是从0开始的连续时间索引,不能直接使用原始年份数值- 如果你的数据已经是累计采用量,可以跳过第一步的
cumsum计算
内容的提问来源于stack exchange,提问作者Obed
相关产品推荐
相关产品推荐

