计算R中的置信区间

时间:2019-03-27 05:55:13

标签: r

我正在尝试根据R中的t检验手动计算置信区间,我怀疑我的计算方法已经关闭。

这是我现在手动计算置信区间的方式

library(broom)
data("mtcars")
a1=tidy(t.test(mpg ~ am, mtcars))
mean_diff<-a1$estimate 
tvalue <-a1$statistic

#standard error 
sd1=sd(mtcars$mpg[mtcars$am==0])
sd2=sd(mtcars$mpg[mtcars$am==1])
n1=length(mtcars$mpg[mtcars$am==0])
n2=length(mtcars$mpg[mtcars$am==1])
#formula for standard error
stan_error=sqrt((sd1/n1)+(sd2/n2))

然后我从本页上获取有关计算置信区间http://onlinestatbook.com/2/estimation/difference_means.html

的公式

我这样计算的较低置信区间

lower=mean_diff - (tvalue * stan_error)'

结果为-4.147333

但是置信区间

t.test(mpg ~ am, mtcars)

95 percent confidence interval:
 -11.280194  -3.209684

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

首先,t的临界值不正确。

tvalue <- a1$statistic需要替换为tvalue <- abs(qt(0.05/2, 30))

请注意它不是32,因为我们失去了2个自由度。

您在标准误差的公式中缺少^2(即2的幂)。 sd1sd2中的内容属于标准错误,因此您需要将其转换为差异。 因此正确的公式是:

stan_error = sqrt((sd1^2 / n1) + (sd2^2 / n2))

因此新代码变为:

library(broom)
data("mtcars")
a1=tidy(t.test(mpg ~ am, mtcars))
mean_diff<-a1$estimate 

t_cv<- abs(qt(0.05/2, 30))

#standard error 
sd1=sd(mtcars$mpg[mtcars$am==0])
sd2=sd(mtcars$mpg[mtcars$am==1])
n1=length(mtcars$mpg[mtcars$am==0])
n2=length(mtcars$mpg[mtcars$am==1])

#formula for standard error
stan_error = sqrt((sd1^2 / n1) + (sd2^2 / n2))

lower=mean_diff - (t_cv* stan_error)

lower
[1] -11.17264

但这仍然与使用t.test函数的置信区间不匹配,因为t.test使用Welch的t检验(https://en.wikipedia.org/wiki/Welch%27s_t-test) 因此,在Welch的t检验下,您的t临界值应该是

# Welch's t test degrees of freedom
welch_df <- (sd1^2/n1 + sd2^2/n2)^2 / (sd1^4/(n1^2*(n1-1)) + sd2^4/(n2^2*(n2-1)))
t_cv <- abs(qt(0.05/2, welch_df))  

# Recalculate lower confidence interval
lower= mean_diff - (t_cv* stan_error)
lower
[1] -11.28019 # this matches confidence interval in t.test

答案 1 :(得分:1)

对于有限大小的样本或无法先验地假设正态性的情况,可以采用更通用的方法,因此样本分布模型(例如学生)可能不可用或不适用。 [1,2]。

首先加载boot R软件包(1.3-24版)

RStudio会话信息 创建:2020年5月12日星期二10:20:56 R版本:4.0.0昵称:植树节 平台:x86_64-w64-mingw32

  library(boot)

idx<-c(1:32)


diff.means <- function(d,idx) 


  {   
    m1 = mean(subset(d[idx, 1], d[idx, 9] == 1),na.rm=TRUE)
    m2 = mean(subset(d[idx, 1], d[idx, 9] == 0),na.rm=TRUE)
    gp1
    ss1=sum(subset(d[, 1], d[, 9] == 1)-m1)^2
    ss2=sum(subset(d[, 1], d[, 9] == 0)-m2)^2
    m= (m2-m1)
    v=(ss1 + ss2)/(max(idx) - 2)
    c(m,v)
    }



d<-mtcars

mpg.boot<- boot( data=mtcars,diff.means,R=100)

vt0 <- mpg.boot$t0[2]/mpg.boot$t0[1]^2
vt<-mpg.boot$t[, 2]/mpg.boot$t[ ,1]^2

mpg.ci<-boot.ci(mpg.boot, statistics= d,type = c("all"))



mpg.ci$t0

mpg.ci$normal[2]
mpg.ci$basic[4]
mpg.ci$percent[4]
mpg.ci$bca[4]
mpg.ci$student[4]

仅进行100次重采样(R = 100),我们可以看到这四种方法产生的下区间值彼此相似,并且与学生的分配方法相当:

  1. 正常近似值:-11.24714
  2. 基本引导程序方法:-11.70073
  3. 引导程序百分位数方法:-10.82624
  4. 调整后的引导百分位数(BCa)方法:-11.23585

R的值在一定程度上是任意的,并且受执行速度要求的限制。较高的R值不会创建新数据。这只是说明如果有更大的样本可用,统计数据将如何表现。

plot(mpg.boot)

Historgram and q-q- plot of resmapled distribution

1:Bruce,P,Bruce,A。,数据科学家实用统计学,O'Reilly,第一版,2017年,第57-60页。