如何使函数return具有特定位数
How to make a function return a specific number of digits
我一直在使用一个函数来计算 t 检验,在每个条件下使用均值、标准差和 n。
ttest <- function(m1,m2,s1,s2,n1,n2,m0=0,equal.variance=FALSE)
{
if( equal.variance==FALSE )
{
se <- sqrt( (s1^2/n1) + (s2^2/n2) )
df <- ( (s1^2/n1 + s2^2/n2)^2 )/( (s1^2/n1)^2/(n1-1) + (s2^2/n2)^2/(n2-1) )
} else
{
se <- sqrt( (1/n1 + 1/n2) * ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2) )
df <- n1+n2-2
}
t <- (m1-m2-m0)/se
sdpooled_n <- ((n1-1)*(s1^2)) + ((n2-1)*(s2^2))
sdpooled_df <- ((n1 + n2) - 2) # 115
sdpooled <- sqrt(sdpooled_n/sdpooled_df)
cohend <- (m1-m2)/sdpooled
dat <- c(m1-m2, se, t, df,2*pt(-abs(t),df),cohend)
names(dat) <- c("Mean difference", "Std Error", "t","df", "p-value","Cohen's d")
return(dat)
}
效果很好,但令人恼火的是 returnR 使用科学记数法得出结果。例如,这段代码:
ttest(1.44,1.02,0.80,0.75,133,123,m0=0,equal.variance=FALSE)
Returns:
Mean difference Std Error t df p-value Cohen's d
4.200000e-01 9.687725e-02 4.335383e+00 2.539507e+02 2.099250e-05 5.409679e-01
如果它会 return 这个就好了:
Mean difference Std Error t df p-value Cohen's d
0.42 0.10 4.34 253.95 0.000 0.54
我试过使用 round() 函数(见下文),它工作得很好,除了它只显示 p 值的小数点后两位。重要的是我要报告准确的 p 值,除非 p<.001.
这是我改进后的代码版本:
ttest <- function(m1,m2,s1,s2,n1,n2,m0=0,equal.variance=FALSE)
{
if( equal.variance==FALSE )
{
se <- sqrt( (s1^2/n1) + (s2^2/n2) )
df <- ( (s1^2/n1 + s2^2/n2)^2 )/( (s1^2/n1)^2/(n1-1) + (s2^2/n2)^2/(n2-1) )
} else
{
se <- sqrt( (1/n1 + 1/n2) * ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2) )
df <- n1+n2-2
}
mdif <- m1-m2
t <- (mdif-m0)/se
sdpooled_n <- ((n1-1)*(s1^2)) + ((n2-1)*(s2^2))
sdpooled_df <- ((n1 + n2) - 2) # 115
sdpooled <- sqrt(sdpooled_n/sdpooled_df)
cohend <- (m1-m2)/sdpooled
p <- 2*pt(-abs(t),df)
mdif <- round(mdif,2)
se <- round(se,2)
t <- round(t,2)
df <- round(df,2)
p <- round(p,3)
cohend <- round(cohend,2)
dat <- c(mdif, se, t, df,p,cohend)
names(dat) <- c("Mean difference", "Std Error", "t","df", "p-value","Cohen's d")
return(dat)
}
但如您所见,它不会 return 将 p 值精确到小数点后 3 位:
Mean difference Std Error t df p-value Cohen's d
0.42 0.10 4.34 253.95 0.00 0.54
您可以在第一个 ttest 函数中添加 dat
,如下所示:
dat <-round(c(m1-m2, se, t, df,2*pt(-abs(t),df),cohend) , digits =2 )
祝福!
我一直在使用一个函数来计算 t 检验,在每个条件下使用均值、标准差和 n。
ttest <- function(m1,m2,s1,s2,n1,n2,m0=0,equal.variance=FALSE)
{
if( equal.variance==FALSE )
{
se <- sqrt( (s1^2/n1) + (s2^2/n2) )
df <- ( (s1^2/n1 + s2^2/n2)^2 )/( (s1^2/n1)^2/(n1-1) + (s2^2/n2)^2/(n2-1) )
} else
{
se <- sqrt( (1/n1 + 1/n2) * ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2) )
df <- n1+n2-2
}
t <- (m1-m2-m0)/se
sdpooled_n <- ((n1-1)*(s1^2)) + ((n2-1)*(s2^2))
sdpooled_df <- ((n1 + n2) - 2) # 115
sdpooled <- sqrt(sdpooled_n/sdpooled_df)
cohend <- (m1-m2)/sdpooled
dat <- c(m1-m2, se, t, df,2*pt(-abs(t),df),cohend)
names(dat) <- c("Mean difference", "Std Error", "t","df", "p-value","Cohen's d")
return(dat)
}
效果很好,但令人恼火的是 returnR 使用科学记数法得出结果。例如,这段代码:
ttest(1.44,1.02,0.80,0.75,133,123,m0=0,equal.variance=FALSE)
Returns:
Mean difference Std Error t df p-value Cohen's d
4.200000e-01 9.687725e-02 4.335383e+00 2.539507e+02 2.099250e-05 5.409679e-01
如果它会 return 这个就好了:
Mean difference Std Error t df p-value Cohen's d
0.42 0.10 4.34 253.95 0.000 0.54
我试过使用 round() 函数(见下文),它工作得很好,除了它只显示 p 值的小数点后两位。重要的是我要报告准确的 p 值,除非 p<.001.
这是我改进后的代码版本:
ttest <- function(m1,m2,s1,s2,n1,n2,m0=0,equal.variance=FALSE)
{
if( equal.variance==FALSE )
{
se <- sqrt( (s1^2/n1) + (s2^2/n2) )
df <- ( (s1^2/n1 + s2^2/n2)^2 )/( (s1^2/n1)^2/(n1-1) + (s2^2/n2)^2/(n2-1) )
} else
{
se <- sqrt( (1/n1 + 1/n2) * ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2) )
df <- n1+n2-2
}
mdif <- m1-m2
t <- (mdif-m0)/se
sdpooled_n <- ((n1-1)*(s1^2)) + ((n2-1)*(s2^2))
sdpooled_df <- ((n1 + n2) - 2) # 115
sdpooled <- sqrt(sdpooled_n/sdpooled_df)
cohend <- (m1-m2)/sdpooled
p <- 2*pt(-abs(t),df)
mdif <- round(mdif,2)
se <- round(se,2)
t <- round(t,2)
df <- round(df,2)
p <- round(p,3)
cohend <- round(cohend,2)
dat <- c(mdif, se, t, df,p,cohend)
names(dat) <- c("Mean difference", "Std Error", "t","df", "p-value","Cohen's d")
return(dat)
}
但如您所见,它不会 return 将 p 值精确到小数点后 3 位:
Mean difference Std Error t df p-value Cohen's d
0.42 0.10 4.34 253.95 0.00 0.54
您可以在第一个 ttest 函数中添加 dat
,如下所示:
dat <-round(c(m1-m2, se, t, df,2*pt(-abs(t),df),cohend) , digits =2 )
祝福!