如何绘制r中未知参数的幂和真实值的图形?

发布于 2025-01-28 01:27:53 字数 2026 浏览 4 评论 0原文

假设IID随机示例X_I \ SIM BERNOULLI(\ pi) i = 1,\ dots,100和样本大小为100。我们想进行假设测试, H_0:\ pi \ ge 0.6,\,h_a:\ pi< 0.6 我想在我们的真实参数pi和电源之间获得关系。我有函数power。但是我只能输入每个TRUE pi = 0.50,0.51,0.52,0.53,...,0.59。如何绘制类似的数字?

“在此处输入图像描述”

我的代码如下。

n=100
pi0=0.60

##power function
power_fun=function(N,pi,alpha)
{
  pvalue=c()
  power=c()
  rej=c()
  
  for (i in 1:N) {
    set.seed(i)
    y=rbinom(n,size=1,prob=pi)
    pi_hat=mean(y)
    z=(pi_hat-pi0)/sqrt(1/n*pi_hat*(1-pi_hat))
    
    rej[i]=ifelse(z<qnorm(0.05,mean=0,sd=1),1,0)
    
    pvalue[i]=pnorm(q=z,mean=0,sd=1)
    
    c_value=qnorm(alpha,mean=0,sd=1)
    aug_term=(pi-pi0)/sqrt(1/n*pi_hat*(1-pi_hat))
    power[i]=pnorm(c_value-aug_term,mean=0,sd=1)
    
  }

  mean_pvalue=mean(pvalue)

  sd_pvalue=sd(pvalue)
  

  mean_power=ifelse(pi<pi0,mean(power),NA)

  sd_power=sd(power)
  
  rej_rate=mean(pvalue<alpha)
  
  type1_error=ifelse(pi>=pi0,rej_rate,NA)
  
  type2_error=ifelse(pi<pi0,1-mean_power,NA)
  
  type2_error_emp=ifelse(pi<pi0,1-rej_rate,NA)
  
  mc_se=sqrt(1/N*rej_rate*(1-rej_rate))
  
  df_out=data.frame("pvalue"=mean_pvalue,"pvalue2"=sd_pvalue,"power"=mean_power,"ESE_power"=sd_power, 
                    "rejection rate"=rej_rate,
                    "Type I error"=  type1_error,"type_II_error"=type2_error,"Type_II_error"=type2_error_emp,
                    "MC_SE"=mc_se)
  rownames(df_out)=paste0("N=",N,", pi=",pi, ", alpha=", alpha)
  
  df_out=round(df_out,3)
  
  return(df_out)
}

对于每个pi,我们可以获取电源。


power_fun(N=1000,pi=0.5,alpha=0.05)
#power=0.643
power_fun(N=1000,pi=0.51,alpha=0.05)
# power=0.566
power_fun(N=1000,pi=0.52,alpha=0.05)
power_fun(N=1000,pi=0.53,alpha=0.05)
power_fun(N=1000,pi=0.54,alpha=0.05)

但这太复杂了。是否有一种简单的方法来获取这些PI值的功能并绘制其pipower的图表?

Assume that iid random sample X_i\sim Bernoulli(\pi) for i=1,\dots, 100 and sample size is 100. We want to do a hypothesis test that
H_0: \pi\ge 0.6,\, H_a: \pi<0.6
I want to get a plot of the relation between our true parameter pi and power. I have got the function power. But I can only input each true pi=0.50, 0.51, 0.52, 0.53, ..., 0.59. How to plot a similar figure?

enter image description here

My code is as follows.

n=100
pi0=0.60

##power function
power_fun=function(N,pi,alpha)
{
  pvalue=c()
  power=c()
  rej=c()
  
  for (i in 1:N) {
    set.seed(i)
    y=rbinom(n,size=1,prob=pi)
    pi_hat=mean(y)
    z=(pi_hat-pi0)/sqrt(1/n*pi_hat*(1-pi_hat))
    
    rej[i]=ifelse(z<qnorm(0.05,mean=0,sd=1),1,0)
    
    pvalue[i]=pnorm(q=z,mean=0,sd=1)
    
    c_value=qnorm(alpha,mean=0,sd=1)
    aug_term=(pi-pi0)/sqrt(1/n*pi_hat*(1-pi_hat))
    power[i]=pnorm(c_value-aug_term,mean=0,sd=1)
    
  }

  mean_pvalue=mean(pvalue)

  sd_pvalue=sd(pvalue)
  

  mean_power=ifelse(pi<pi0,mean(power),NA)

  sd_power=sd(power)
  
  rej_rate=mean(pvalue<alpha)
  
  type1_error=ifelse(pi>=pi0,rej_rate,NA)
  
  type2_error=ifelse(pi<pi0,1-mean_power,NA)
  
  type2_error_emp=ifelse(pi<pi0,1-rej_rate,NA)
  
  mc_se=sqrt(1/N*rej_rate*(1-rej_rate))
  
  df_out=data.frame("pvalue"=mean_pvalue,"pvalue2"=sd_pvalue,"power"=mean_power,"ESE_power"=sd_power, 
                    "rejection rate"=rej_rate,
                    "Type I error"=  type1_error,"type_II_error"=type2_error,"Type_II_error"=type2_error_emp,
                    "MC_SE"=mc_se)
  rownames(df_out)=paste0("N=",N,", pi=",pi, ", alpha=", alpha)
  
  df_out=round(df_out,3)
  
  return(df_out)
}

For each pi, we can get power.


power_fun(N=1000,pi=0.5,alpha=0.05)
#power=0.643
power_fun(N=1000,pi=0.51,alpha=0.05)
# power=0.566
power_fun(N=1000,pi=0.52,alpha=0.05)
power_fun(N=1000,pi=0.53,alpha=0.05)
power_fun(N=1000,pi=0.54,alpha=0.05)

But this is too complicated. Is there an easy way to get the power of these pi values and plot their graph of pi and power?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鲸落 2025-02-04 01:27:53

这更像是代码审查。

我认为您可以通过npialpha进行矢量化。
我认为您无法通过当前的实施。

遵循 @limey的建议:

#' Power function
#' 
#' 
#' @param N Total number of replications
#' @param pi 
#' @param alpha Significance level
#' @param pi0 
#' @param n Size of the replication
#'
#' @return
#' 
power_fun <- function(N, pi, alpha, pi0, n) {
  pvalue <- vector(mode = "numeric", length = N)
  power <- vector(mode = "numeric", length = N)
  rej <- vector(mode = "numeric", length = N)
  
  for (i in seq_len(N)) {
    # why?
    # set.seed(i)
    y = rbinom(n, size = 1, prob = pi)
    pi_hat = mean(y)
    z = (pi_hat - pi0) / sqrt(1 / n * pi_hat * (1 - pi_hat))
    
    rej[i] = ifelse(z < qnorm(0.05, mean = 0, sd = 1), 1, 0)
    
    pvalue[i] = pnorm(q = z, mean = 0, sd = 1)
    
    c_value = qnorm(alpha, mean = 0, sd = 1)
    aug_term = (pi - pi0) / sqrt(1 / n * pi_hat * (1 - pi_hat))
    power[i] = pnorm(c_value - aug_term, mean = 0, sd = 1)
    
  }
  
  mean_pvalue = mean(pvalue, na.rm = TRUE)
  sd_pvalue = sd(pvalue, na.rm = TRUE)
  # mean_power = ifelse(pi < pi0, mean(power), NA)
  mean_power = mean(power, na.rm = TRUE)
  sd_power = sd(power, na.rm = TRUE)
  rej_rate = mean(pvalue < alpha, na.rm = TRUE)
  
  type1_error = ifelse(pi >= pi0, rej_rate, NA)
  type2_error = ifelse(pi < pi0, 1 - mean_power, NA)
  type2_error_emp = ifelse(pi < pi0, 1 - rej_rate, NA)
  
  mc_se = sqrt(1 / N * rej_rate * (1 - rej_rate))
  
  df_out <- data.frame(
    N = N, 
    pi = pi, 
    alpha = alpha,
    pvalue = mean_pvalue,
    pvalue2 = sd_pvalue,
    power = mean_power,
    ESE_power = sd_power,
    rejection_rate = rej_rate,
    Type_I_error =  type1_error,
    type_II_error = type2_error,
    Type_II_error = type2_error_emp,
    MC_SE = mc_se
  )
  # moved this to above
  # rownames(df_out) = paste0("N=", N, ", pi=", pi, ", alpha=", alpha)
  
  # why?
  # df_out = round(df_out, 3)
  
  return(df_out)
}

请阅读评论和更改。

library(tidyverse)
n <- 100
pi0 <- 0.6

# testing the function
power_fun(N=1000,pi=0.5,alpha=0.05, pi0 = pi0, n = n)

#' Plot for all pi going from 0.5 to 1.
seq.default(0, 0.65, length.out = 200) %>%
# seq.default(0.5, 1., length.out = 2) %>% 
  map_df(function(pi) power_fun(N=1000,pi=pi,alpha=0.05, pi0 = pi0, n = n)) %>% 
  as_tibble() -> 
  power_df
# power_df %>% View()
power_df %>% {
  ggplot(., aes(pi, power)) + 
    geom_line() + 
    # geom_point() +
    geom_vline(xintercept = pi0, linetype = "dashed") +
    NULL
}

This is more like a code-review.

I think that you thought that you could vectorise over N, pi, and alpha.
I don't think you can that with your current implementation.

Following @Limey's advice:

#' Power function
#' 
#' 
#' @param N Total number of replications
#' @param pi 
#' @param alpha Significance level
#' @param pi0 
#' @param n Size of the replication
#'
#' @return
#' 
power_fun <- function(N, pi, alpha, pi0, n) {
  pvalue <- vector(mode = "numeric", length = N)
  power <- vector(mode = "numeric", length = N)
  rej <- vector(mode = "numeric", length = N)
  
  for (i in seq_len(N)) {
    # why?
    # set.seed(i)
    y = rbinom(n, size = 1, prob = pi)
    pi_hat = mean(y)
    z = (pi_hat - pi0) / sqrt(1 / n * pi_hat * (1 - pi_hat))
    
    rej[i] = ifelse(z < qnorm(0.05, mean = 0, sd = 1), 1, 0)
    
    pvalue[i] = pnorm(q = z, mean = 0, sd = 1)
    
    c_value = qnorm(alpha, mean = 0, sd = 1)
    aug_term = (pi - pi0) / sqrt(1 / n * pi_hat * (1 - pi_hat))
    power[i] = pnorm(c_value - aug_term, mean = 0, sd = 1)
    
  }
  
  mean_pvalue = mean(pvalue, na.rm = TRUE)
  sd_pvalue = sd(pvalue, na.rm = TRUE)
  # mean_power = ifelse(pi < pi0, mean(power), NA)
  mean_power = mean(power, na.rm = TRUE)
  sd_power = sd(power, na.rm = TRUE)
  rej_rate = mean(pvalue < alpha, na.rm = TRUE)
  
  type1_error = ifelse(pi >= pi0, rej_rate, NA)
  type2_error = ifelse(pi < pi0, 1 - mean_power, NA)
  type2_error_emp = ifelse(pi < pi0, 1 - rej_rate, NA)
  
  mc_se = sqrt(1 / N * rej_rate * (1 - rej_rate))
  
  df_out <- data.frame(
    N = N, 
    pi = pi, 
    alpha = alpha,
    pvalue = mean_pvalue,
    pvalue2 = sd_pvalue,
    power = mean_power,
    ESE_power = sd_power,
    rejection_rate = rej_rate,
    Type_I_error =  type1_error,
    type_II_error = type2_error,
    Type_II_error = type2_error_emp,
    MC_SE = mc_se
  )
  # moved this to above
  # rownames(df_out) = paste0("N=", N, ", pi=", pi, ", alpha=", alpha)
  
  # why?
  # df_out = round(df_out, 3)
  
  return(df_out)
}

Please read the comments and the changes.

library(tidyverse)
n <- 100
pi0 <- 0.6

# testing the function
power_fun(N=1000,pi=0.5,alpha=0.05, pi0 = pi0, n = n)

#' Plot for all pi going from 0.5 to 1.
seq.default(0, 0.65, length.out = 200) %>%
# seq.default(0.5, 1., length.out = 2) %>% 
  map_df(function(pi) power_fun(N=1000,pi=pi,alpha=0.05, pi0 = pi0, n = n)) %>% 
  as_tibble() -> 
  power_df
# power_df %>% View()
power_df %>% {
  ggplot(., aes(pi, power)) + 
    geom_line() + 
    # geom_point() +
    geom_vline(xintercept = pi0, linetype = "dashed") +
    NULL
}

Power plot with pi going from 0.5 to 0.65

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文