R 按组拟合logistic模型预测值

R 按组拟合logistic模型预测值,r,dplyr,predict,R,Dplyr,Predict,尝试将多个逻辑模型与不同县的数据相匹配,并希望在最后将其全部放在一个数据框架中(所有县,所有预测人口,特定年份) 以下是数据: county <- structure(list(name = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7

尝试将多个逻辑模型与不同县的数据相匹配,并希望在最后将其全部放在一个数据框架中(所有县,所有预测人口,特定年份)

以下是数据:

county <- structure(list(name = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
5L, 5L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 
8L, 9L, 9L, 9L, 9L, 9L), .Label = c("Alachua", "Columbia", "Gilchrist", 
"Lake", "Levy", "Marion", "Orange", "Seminole", "Volusia"), class = 
"factor"), 
year = c(1920L, 1940L, 1970L, 1990L, 2010L, 1920L, 1940L, 
1970L, 1990L, 2010L, 1920L, 1940L, 1970L, 1990L, 2010L, 1920L, 
1940L, 1970L, 1990L, 2010L, 1920L, 1940L, 1970L, 1990L, 2010L, 
1920L, 1940L, 1970L, 1990L, 2010L, 1920L, 1940L, 1970L, 1990L, 
2010L, 1920L, 1940L, 1970L, 1990L, 2010L, 1920L, 1940L, 1970L, 
1990L, 2010L), pop = c(24662.84498, 38518.67335, 105080.0739, 
182378.0527, 247964.4355, 14353.67655, 16988.63031, 25423.53768, 
42636.12851, 67396.52047, 6955.297482, 4331.7027, 3661.621676, 
9835.709676, 16780.95117, 12812.1731, 27202.15681, 65668.28125, 
153585.2153, 297441.8053, 10034.20186, 12707.52359, 12911.58508, 
26370.47373, 41650.51535, 23990.09377, 31340.67059, 69056.41468, 
194358.0547, 334117.7792, 19825.73528, 68559.76913, 337259.2307, 
670422.46, 1140314.083, 11027.52715, 23881.62063, 91628.11201, 
298115.877, 438079.7446, 24526.72497, 55775.68449, 175004.8787, 
382885.1367, 516049.0225)), .Names = c("name", "year", "pop"
), row.names = c(NA, -45L), class = "data.frame")

不知道他们要去哪个县?如果我单独使用这段代码(不使用groupby),我可以让它工作。但是,我必须为每个县单独做,然后自己绑定,一旦我与9个以上的县合作,这将变得单调乏味

正如@Esther在评论中所建议的,好的第一步是提取 将匿名预测函数转换为命名函数。这也是有道理的 使函数接受预测年份作为参数,而不是 在函数内部修复它们:

predict_pop 3 Alachua 2007 239432.0
#>4阿拉丘亚2012 255440.9
#>5哥伦比亚1992年
#>6哥伦比亚2002北美
在这里,我们可以看到对哥伦比亚县的预测缺失 模型拟合失败

对于每个县,还有其他几种预测方法。其中之一 @rawr和@Esther在评论中提到的替代方案是使用
do()

country%>%
分组单位(名称)%>%
do(预测流行时间(,年))%>%
总目()
#>#tibble:6 x 3
#>#组:名称[2]
#>名称年份pred
#>          
#>1阿拉丘亚1992 186021。
#>2阿拉丘亚2002 222332。
#>3 Alachua 2007 239432。
#>4阿拉丘亚2012 255441。
#>5哥伦比亚1992年
#>6哥伦比亚2002北美
另一种方法是通过分配分组数据来创建“嵌套”数据框 使用
tidyr::nest()
将数据导入列表列。然后我们可以使用
lappy()
来 从模型中获取每个数据子集的预测,最后
tidyr::unest()
从列表列获取预测

country%>%
tidyr::nest(-name)%%>%
tidyr::unnest(lappy(数据、预测、年份))%>%
总目()
#>名称年份pred
#>1阿拉丘亚1992 186020.6
#>2阿拉丘亚2002 222332.3
#>3 Alachua 2007 239432.0
#>4阿拉丘亚2012 255440.9
#>5哥伦比亚1992年
#>6哥伦比亚2002北美
我们有了它:一整套处理许多模型的技术。关于这方面的进一步讨论和示例,您可能对R For Data Science一书中的内容感兴趣


由(v0.2.0)于2018-06-04创建。

我不使用dplyr,但您可能可以使用
..%>%do({fm给匿名函数起个名字,然后用'do'调用它,如中所示
library(dplyr) 
county %>% 
    group_by(name) %>%
    (function(x) {
            fm<- nls(pop ~ SSlogis(year, phi1, phi2, phi3), data = x)
            timevalues <- c(1992, 2002, 2007, 2012)
            predict <- predict(fm,list(year=timevalues))
            cbind(predict, predict)
    })
out:
  predict  predict
[1,] 226713.5 226713.5
[2,] 293596.4 293596.4
[3,] 326455.5 326455.5
[4,] 357640.8 357640.8