微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获得一辆汽车的 mpg 比其他汽车最低的概率?

如何解决如何获得一辆汽车的 mpg 比其他汽车最低的概率?

我用它来获得汽车 mpg 的均值和标准差

df1 <- mtcars; df1$rownames = rownames(df1)
df2 <- mtcars; df2$rownames = rownames(df2)
df2$mpg = df2$mpg + rnorm(nrow(df2),3)
data = rbind(df1,df2)

我使用一个函数获取一辆车的 mpg 低于其他汽车的概率

df = plyr::ddply(data,~rownames,summarise,mean=mean(mpg),sd=sd(mpg))

f <- function(x,y){
  n1 = df$mean[x]; n2 = df$mean[y]; sd1 = df$sd[x]; sd2 = df$sd[y]
  pnorm(0,mean = n1 - n2,sd = sqrt(sd1^2 + sd2^2))
}

res <- outer(X = 1:nrow(df),Y = 1:nrow(df),f)
dimnames(res) <- list(df$rownames,df$rownames)
res <- data.frame(res)
res <- tibble::rownames_to_column(res,'p1')

datalong_2 <- tidyr::gather(res,'p2','value',-1) # output

现在我想要一辆车的 mpg 比其他汽车最低的概率。我绑了这个:

cars = unique(datalong_2$p1)
win <- data.frame(sapply(1:length(cars),function(x) setNames(prod(subset(datalong_2,p1 == cars[x] & p2 != cars[x])$value),cars[x])))

colnames(win) <- "prob"
win$prob <- round(win$prob,4)

但概率加起来不等于一。我如何更改此代码以获得一个表格,其中每辆车的 mpg 比其他汽车最低的概率?

解决方法

这里是返回概率的 dplyr/data.table 方法的比较

library(dplyr)
library(data.table)
library(tidyr)
library(tibble)
# // input data
df <- mtcars[1] %>% 
         rownames_to_column("car")

-测试

# // dplyr
system.time({
        out <- df %>%
                uncount(10000,.id = "run") %>%
                rowwise() %>%
                mutate(sim_mpg = rpois(1,lambda = mpg)) %>%

                group_by(run) %>%
                arrange(sim_mpg) %>%
                mutate(lowest_mpg = row_number() == 1) %>%

                group_by(car) %>%
                summarize(chance_lowest = mean(lowest_mpg),orig_mpg = first(mpg))

})
# user system elapsed
# 1.715 0.074 1.787


# // data.table
system.time({

     df_expand <- setDT(df)[rep(seq_len(.N),10000)][,run := rowid(car)]

     out2 <- df_expand[,sim_mpg := rpois(1,lambda = mpg),1:nrow(df_expand)
        ][order(sim_mpg),lowest_mpg := seq_len(.N) == 1,run
        ][,.(chance_lowest = mean(lowest_mpg),orig_mpg = first(mpg)),.(car)]
})
# user system elapsed
# 0.704 0.050 0.757
sum(out$chance_lowest)
#[1] 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。