使分布适合多个子集并提取参数

时间:2018-08-04 14:16:40

标签: r for-loop distribution sads

我想使分布适合大型数据框的多个子集。子集将基于每个year,并且分布将适合freq

示例数据框:

df<- data.frame(year=c(rep(1998, 15), rep(1999, 16)),freq=c(103, 115, 13, 2, 67, 36, 51, 8, 6, 61, 10, 21,
      7, 65, 4, 49, 92, 37, 16, 6, 23, 9, 2, 6, 5, 4,1, 3, 1, 9, 2))

我已经尝试了以下方法来获得拟合分布的系数(alpha参数)以及相关统计信息的输出。

library(sads)

coef_vec<- NA

for (i in 1: length(unique(df$year))){ 
  fit<- fitsad(df$freq[i], sad="ls")
coef_vec[i,] <- as.vector(t(do.call(rbind, coef(summary(coeff))) 
[,1:2]))
} 

我希望输出如下所示:

output<- data.frame(para=rep(c("Estimate", "Std.Errror", "z value", 
"Pr(z)"),2),year= 
c(rep(1998,4),rep(1999,4)),value=c(3.7439,2.2216,1.6852,0.09195,2.8246, 1.8690,1.5113,0.1307))

您会注意到,每年都报告alpha参数和统计信息。我从发现的另一个代码中修改了此代码,但无法正常工作。

1 个答案:

答案 0 :(得分:2)

我们将使用split-apply-combine策略来解决此问题。

首先,我们将数据分为多个子集:

library(sads) # Be sure to specify what package you're using in your question
by_year <- split(df$freq, df$year)

然后,我们遍历子集,对每个子集应用一个函数,以创建具有所需输出的数据框。 (在这里,我们实际上是遍历每个子集的索引,即1、2,...,n,因为这使我们能够获取每个子集的名称,在本例中为年份)。

out <- lapply(seq_along(by_year), function(i) {
  fitted <- fitsad(by_year[[i]], sad = "ls")
  coefs <- coef(summary(fitted))
  df <- data.frame(param = colnames(coefs),
                   year = names(by_year)[i],
                   value = as.vector(coefs))
  df
})

最后,我们将输出合并为一个数据帧:

data.frame(do.call(rbind, out), row.names = NULL)
#        param year      value
# 1   Estimate 1998 2.82461397
# 2 Std. Error 1998 1.86900479
# 3    z value 1998 1.51129307
# 4      Pr(z) 1998 0.13071380
# 5   Estimate 1999 3.74388575
# 6 Std. Error 1999 2.22161670
# 7    z value 1999 1.68520778
# 8      Pr(z) 1999 0.09194849

使用tidyverse方法进行拆分应用合并:

library(dplyr)
library(tidyr)
library(purrr)

fit <- function(x) {
  values <- coef(summary(fitsad(x$freq, sad = "ls")))
  data.frame(param = colnames(coefs), value = as.vector(values))
}

df %>%
  group_by(year) %>%
  nest(freq) %>%
  mutate(values = map(data, fit)) %>%
  select(year, values) %>%
  unnest()
# # A tibble: 8 x 3
#    year param       value
#   <dbl> <fct>       <dbl>
# 1  1998 Estimate   2.82  
# 2  1998 Std. Error 1.87  
# 3  1998 z value    1.51  
# 4  1998 Pr(z)      0.131 
# 5  1999 Estimate   3.74  
# 6  1999 Std. Error 2.22  
# 7  1999 z value    1.69  
# 8  1999 Pr(z)      0.0919