【问题标题】:How to calculate the Bonferroni Lower and Upper limits in R?如何计算 R 中的 Bonferroni 下限和上限?
【发布时间】:2019-07-16 17:14:26
【问题描述】:

使用以下数据,我正在尝试计算 Chi Square 和 Bonferroni 上下置信区间。 “Data_No”列标识数据集(因为需要为每个数据集单独进行计算)。

Data_No    Area    Observed
   1        3353    31
   1        2297    2
   1        1590    15
   1        1087    16
   1        817     2
   1        847     10
   1        1014    28
   1        872     29
   1        1026    29
   1        1215    21
   2        3353    31
   2        2297    2
   2        1590    15
   3        1087    16
   3        817     2

我使用的代码是

        library(dplyr) 
        setwd("F:/GIS/July 2019/") 
        total_data <- read.csv("test.csv") 
        result_data <- NULL 
        for(i in unique(total_data$Data_No)){ 
        data <- total_data[which(total_data$Data_No == i),] data <- data %>%
        mutate(RelativeArea = Area/sum(Area), Expected = RelativeArea*sum(Observed), OminusE = Observed-Expected, O2 = OminusE^2, O2divE = O2/Expected, APU = Observed/sum(Observed), Alpha = 0.05/2*count(Data_No), 
Zvalue = qnorm(Alpha,lower.tail=FALSE), lower = APU-Zvalue*sqrt(APU*(1-APU)/sum(Observed)), upper = APU+Zvalue*sqrt(APU*(1-APU)/sum(Observed)))
result_data <- rbind(result_data,data) }
write.csv(result_data,file='final_result.csv')

我得到的错误信息是:

UseMethod("summarise_") 中的错误:没有适用的方法 'summarise_' 应用于“c('integer', 'numeric')”类的对象

我称之为“Alpha”的列是 0.05/2k 的 alpha 值,其中 K 是类别数 - 在我的示例中,我有 10 个类别(“Data_No”列)用于第一个数据集,所以“ Alpha"需要为0.05/20 = 0.0025,对应的Z值为2.807。第二个数据集有 3 个类别(所以 0.05/6),第三个数据集在我的示例表(Data_No”列)中有 2 个类别(0.05/4)。使用新计算的“Alpha”列中的值,然后我需要计算ZValue 列 (Zvalue = qnorm(Alpha,lower.tail=FALSE)),然后我用它来计算上下置信区间。

从上面的数据来看,我应该得到以下结果,但请注意,我必须手动计算 Alpha 列和 Z 值,而不是在 R 代码中插入这些计算:

Data_No Area    Observed    RelativeArea    Alpha   Z value lower   upper
    1   3353    31          0.237           0.003   2.807   0.092   0.247
    1   2297    2           0.163           0.003   2.807   -0.011  0.033
    1   1590    15          0.113           0.003   2.807   0.025   0.139
    1   1087    16          0.077           0.003   2.807   0.029   0.146
    1   817     2           0.058           0.003   2.807   -0.011  0.033
    1   847     10          0.060           0.003   2.807   0.007   0.102
    1   1014    28          0.072           0.003   2.807   0.078   0.228
    1   872     29          0.062           0.003   2.807   0.083   0.234
    1   1026    29          0.073           0.003   2.807   0.083   0.234
    1   1215    21          0.086           0.003   2.807   0.049   0.181
    2   3353    31          0.463           0.008   2.394   0.481   0.811
    2   2297    2           0.317           0.008   2.394   -0.027  0.111
    2   1590    15          0.220           0.008   2.394   0.152   0.473
    3   1087    16          0.571           0.013   2.241   0.723   1.055
    3   817     2           0.429           0.013   2.241   -0.055  0.277

请注意,我只包含了从代码生成的一些列。

【问题讨论】:

  • 嗨 Eleman,我认为每个 Data_No 都需要一个额外的列“NO_OF_CATEGORIES”。代替传递 Data_No,我们可以传递这个 'NO_OF_CATEGORIES' 并在 Alpha 中获得正确的值。

标签: r


【解决方案1】:
# You need to check the closing bracket for lower c.f. sqrt value. Following code should work.

data <- read.csv("test.csv") 
data <- data %>% mutate(RelativeArea =
                          Area/sum(Area), Expected = RelativeArea*sum(Observed), OminusE =
                          Observed-Expected, O2 = OminusE^2, O2divE = O2/Expected, APU =
                          Observed/sum(Observed), lower =
                          APU-2.394*sqrt(APU*(1-APU)/sum(Observed)), upper =
                                           APU+2.394*sqrt(APU*(1-APU)/sum(Observed)))



#Answer to follow-up question.
#Sample Data
Data_No   Area   Observed
1         3353    31
1         2297    2
2         1590    15
2         1087    16

#Code to run
total_data <- read.csv("test.csv")
result_data <- NULL
for(i in unique(total_data$Data_No)){
data <- total_data[which(total_data$Data_No == i),]
data <- data %>% mutate(RelativeArea =
                          Area/sum(Area), Expected = RelativeArea*sum(Observed), OminusE =
                          Observed-Expected, O2 = OminusE^2, O2divE = O2/Expected, APU =
                          Observed/sum(Observed), lower =
                          APU-2.394*sqrt(APU*(1-APU)/sum(Observed)), upper =
                                           APU+2.394*sqrt(APU*(1-APU)/sum(Observed)))

result_data <- rbind(result_data,data)
}

write.csv(result_data,file='final_result.csv')

【讨论】:

  • 谢谢,效果很好。对不起,还有一个问题——我有 60 张这样的桌子。如果我将 60 个表中的每一个的所有这些值复制并粘贴到 excel 电子表格中的同一选项卡中,而不是将每个表保存为 .csv 并将它们单独读取到 R 中,R 是否能够执行相同的计算分别在所有桌子上?谢谢。
  • 嗨 Gaius,感谢您对答案的认可。如果您能批准它作为答案,那就太好了。对于您的后续问题:您将需要在 test.csv 中再添加一个变量,例如 data_no ,它标识您正在处理的数据集。使用该变量,您可以在所有 60 个数据集上运行 for 循环。
  • 太棒了 - 效果很好 - 非常感谢。我已通过单击绿色勾号批准了答案!我试图了解
  • 我意识到对于 60 个表,2.394 不是恒定的,因此我没有得到正确的结果。我试图包含一个代码来计算 z 值,它是 Alpha/2*K,其中 K 是类别数。因此,在您的示例中,我尝试使用“Data_No”列(在此示例中都有两个类别 1,1 和 2,2)来计算类别数,因此 Alpha 值为 0.05/2*2 = 0.0125 和相应的 Z 值 = 2.242,我需要将其用于这两个表计算的最后部分。下面是我使用的代码。
  • 嘿,eleman,您可以在原始问题中添加此代码吗?没有格式,我无法理解它。一旦我知道发生了什么,我认为这应该不是一个大问题。
【解决方案2】:
       #Issue in calculating Alpha. I have updated the code.    
       library(dplyr) 
       setwd("F:/GIS/July 2019/") 
       total_data <- read.csv("test.csv") 
       #Creating the NO_OF_CATEGORIES column based on your question.
       total_data$NO_OF_CATEGORIES <- 0
       total_data[which(total_data$Data_No==1),]$NO_OF_CATEGORIES <- 10
       total_data[which(total_data$Data_No==2),]$NO_OF_CATEGORIES <- 3
       total_data[which(total_data$Data_No==3),]$NO_OF_CATEGORIES <- 2


       #Actual code


     result_data <- NULL 

for(i in unique(total_data$Data_No)){ 
  data <- total_data[which(total_data$Data_No == i),] 
  data <- data %>%
    mutate(RelativeArea = Area/sum(Area), Expected = RelativeArea*sum(Observed), OminusE = Observed-Expected, O2 = OminusE^2, O2divE = O2/Expected, APU = Observed/sum(Observed), Alpha = 0.05/(2*(unique(data$NO_OF_CATEGORIES))), 
           Zvalue = qnorm(Alpha,lower.tail=FALSE), lower = APU-Zvalue*sqrt(APU*(1-APU)/sum(Observed)), upper = APU+Zvalue*sqrt(APU*(1-APU)/sum(Observed)))
  result_data <- rbind(result_data,data) }
write.csv(result_data,file='final_result.csv')

【讨论】:

  • 谢谢。列“Alpha = 0.05/2*(length(unique(total_data$Data_No)))”的代码仍然不知道 Data_No 中的数字(也标识“数据集” ) 需要计算在内。该计数是指类别的数量。下一列是 0.05/2* 类别计数(按数据集),位于 Data_No 下。现在,Alpha 列生成相同的数字,而不是单独计算每个数据集,这是不对的。所以我猜需要修改代码来说明在 Data_No 中有多少行具有相同的数字并使用它来乘以 2(或 0.05/2*count 个类别)?
  • 嗨 Eleman,我已经根据我对您的评论的理解编辑了代码。如果它按您想要的方式工作,请确认。谢谢:)
  • 谢谢 - 不幸的是它不起作用,所以请给我您的电子邮件 ID(或者我可以要求您发送电子邮件至 gaiuswilsonin@gmail.com),我会通过电子邮件发送给您数据并尝试再次解释需要做什么以及结果应该是什么样子。目前,Alpha 列只有一个值,然后生成相同的 Z 值,所以这是错误的。还是我应该只编辑原始问题、表格、结果和预期结果?谢谢@ealbsho93
  • 请编辑原始问题、表格、结果和预期结果。如果您想保留此问题以供参考,您也可以创建一个新问题。
  • 我刚刚做了,希望现在有意义,因为我还展示了预期的结果应该是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多