我正在尝试根据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
有什么想法吗?
答案 0 :(得分:1)
首先,t的临界值不正确。
tvalue <- a1$statistic
需要替换为tvalue <- abs(qt(0.05/2, 30))
。
请注意它不是32,因为我们失去了2个自由度。
您在标准误差的公式中缺少^2
(即2的幂)。
sd1
和sd2
中的内容属于标准错误,因此您需要将其转换为差异。
因此正确的公式是:
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),我们可以看到这四种方法产生的下区间值彼此相似,并且与学生的分配方法相当:
R的值在一定程度上是任意的,并且受执行速度要求的限制。较高的R值不会创建新数据。这只是说明如果有更大的样本可用,统计数据将如何表现。
plot(mpg.boot)
Historgram and q-q- plot of resmapled distribution
1:Bruce,P,Bruce,A。,数据科学家实用统计学,O'Reilly,第一版,2017年,第57-60页。