如何使用 R 中的泊松分布将一个观察值与数据帧的其余部分进行比较?

How to compare one observation against the rest of the dataframe using poisson distribution in R?

我想找到一种方法来比较使用泊松分布的汽车的马力值,看看哪一辆更有可能在所有汽车中具有最低的马力值,例如马自达 Rx4 的马力为 110。 我想按照样本中每辆汽车的泊松分布来模拟这个值。我想创建一个 table 来比较数据框中所有汽车的每辆汽车在该指标中具有最低值的概率

为了简单起见,我使用这个例子,实际上,这些是高尔夫球手的名字,马力是击球次数,这就是为什么我想要一个列表,其中包含每次观察的概率在我的样本中,该指标得分最低

df <- mtcars

f <- function(n1, n2){
  mean(rpois(100, n1) < rpois(100, n2))
  
}


g <- Vectorize(f, c("n1", "n2"))
res <- outer(df$hp, df$hp, g)
dimnames(res) <- list(row.names(df), row.names(df))

此代码将所有汽车相互比较,但我想要一个列表,将每辆汽车与数据框中的所有汽车进行比较,以查看得分最低的概率。例如,Mazda RX4 在数据框中具有最低值的概率:类似

            prob
Mazda RX4   0.03
Datsun 710  0.02
Duster 360  0.02

以此类推,直到样本的最后一辆车。 Prob 是汽车在样本中具有最低 hp 值的概率。

我不太确定我是否正确理解了你的问题,但这里有一个基于原始值创建泊松分布并总结这些模拟的比较结果的示例:

library(tidyverse)
  
df <- mtcars[1] %>% rownames_to_column("car")

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)) %>%
  
ggplot(aes(orig_mpg, chance_lowest, label = car)) +
  geom_text(hjust = 0, check_overlap = TRUE) +
  scale_y_continuous(trans = scales::pseudo_log_trans(sigma = 0.001), 
                     labels = scales::percent_format(accuracy = 1), 
                     breaks = c(0, 0.01, 0.1*(1:4)))