使用 R 中手动设置的平均值计算标准差
Compute standard deviation with a manually set mean in R
我知道如何使用总结计算 sd:
ans <- temp%>% group_by(permno)%>% summarise(std = sd(ret)))
但是如果我知道平均值 = 0,我该如何计算标准偏差?
换句话说,我知道真正的均值,并且想在计算 sd 时使用它而不是使用样本均值。
一种方法是手动编写 sd 函数的代码,但我需要它为每个组工作,所以我被卡住了。
提供可重现的数据总是最好的。这是 iris
数据集的示例:
data(iris)
GM <- mean(iris$Sepal.Length) # "Population mean"
ans <- iris %>% group_by(Species) %>% summarise(std=sum((Sepal.Length - GM)^2)/length(Sepal.Length))
ans
# A tibble: 3 × 2
# Species std
# <fct> <dbl>
# 1 setosa 0.823
# 2 versicolor 0.270
# 3 virginica 0.951
与计算每组均值的标准差相比:
ans <- iris %>% group_by(Species) %>% summarise(std=sd((Sepal.Length)))
ans
# A tibble: 3 × 2
# Species std
# <fct> <dbl>
# 1 setosa 0.352
# 2 versicolor 0.516
# 3 virginica 0.636
请注意 sd
在分母中使用 'n - 1',但由于您表示您的平均值是总体平均值,我们使用 n
。
我想到了这个解决方案:
sd_fn <- function(x, mean_pop) {
sd_f <- sqrt((sum((x-mean_pop)^2))/(length(x)))
sd_f
}
x <- c(1,2,3,-1,-1.5,-2.8)
mean_pop <- 0
sd_fn(x, mean_pop)
我简单地创建了一个函数,其中参数是一个数字向量,人口意味着你已经知道......只需输入带有数据和平均人口的向量,该函数就会给你所需的标准偏差。
您好,如果想根据真实均值计算 sd,我认为您可以使用样本向量平方差的均值函数和真实均值来计算方差,然后使用 sqrt 来计算标准差.请记住,基本 R 的 var 和 sd 函数具有自动贝塞尔校正,您可以在 https://www.r-bloggers.com/2018/11/how-to-de-bias-standard-deviation-estimates/
阅读
#Sample Size
n=1000
#sample Random Vec
universe = rnorm(n,0,3)
# sample mean
p = mean(universe)
p
# true mean
p0 = 0
# calculate "manually" using sample mean
variance <- mean((universe - p)^2)
variance
standard_deviation <- sqrt(variance)
standard_deviation
# calculate "manually" usingtrue mean
variance_true <- mean((universe - p0)^2)
variance_true
standard_deviation_true <- sqrt(variance_true)
standard_deviation_true
# calculate using built in R functions
var_r<-var(universe)
var_r
r_sd<-sd(universe)
r_sd
# They have automatic Bessels correction :
variance * n/(n-1) == var_r # Bessels correction using * n/(n-1)
r_sd == sqrt(variance * n/(n-1) )
我知道如何使用总结计算 sd:
ans <- temp%>% group_by(permno)%>% summarise(std = sd(ret)))
但是如果我知道平均值 = 0,我该如何计算标准偏差?
换句话说,我知道真正的均值,并且想在计算 sd 时使用它而不是使用样本均值。
一种方法是手动编写 sd 函数的代码,但我需要它为每个组工作,所以我被卡住了。
提供可重现的数据总是最好的。这是 iris
数据集的示例:
data(iris)
GM <- mean(iris$Sepal.Length) # "Population mean"
ans <- iris %>% group_by(Species) %>% summarise(std=sum((Sepal.Length - GM)^2)/length(Sepal.Length))
ans
# A tibble: 3 × 2
# Species std
# <fct> <dbl>
# 1 setosa 0.823
# 2 versicolor 0.270
# 3 virginica 0.951
与计算每组均值的标准差相比:
ans <- iris %>% group_by(Species) %>% summarise(std=sd((Sepal.Length)))
ans
# A tibble: 3 × 2
# Species std
# <fct> <dbl>
# 1 setosa 0.352
# 2 versicolor 0.516
# 3 virginica 0.636
请注意 sd
在分母中使用 'n - 1',但由于您表示您的平均值是总体平均值,我们使用 n
。
我想到了这个解决方案:
sd_fn <- function(x, mean_pop) {
sd_f <- sqrt((sum((x-mean_pop)^2))/(length(x)))
sd_f
}
x <- c(1,2,3,-1,-1.5,-2.8)
mean_pop <- 0
sd_fn(x, mean_pop)
我简单地创建了一个函数,其中参数是一个数字向量,人口意味着你已经知道......只需输入带有数据和平均人口的向量,该函数就会给你所需的标准偏差。
您好,如果想根据真实均值计算 sd,我认为您可以使用样本向量平方差的均值函数和真实均值来计算方差,然后使用 sqrt 来计算标准差.请记住,基本 R 的 var 和 sd 函数具有自动贝塞尔校正,您可以在 https://www.r-bloggers.com/2018/11/how-to-de-bias-standard-deviation-estimates/
阅读#Sample Size
n=1000
#sample Random Vec
universe = rnorm(n,0,3)
# sample mean
p = mean(universe)
p
# true mean
p0 = 0
# calculate "manually" using sample mean
variance <- mean((universe - p)^2)
variance
standard_deviation <- sqrt(variance)
standard_deviation
# calculate "manually" usingtrue mean
variance_true <- mean((universe - p0)^2)
variance_true
standard_deviation_true <- sqrt(variance_true)
standard_deviation_true
# calculate using built in R functions
var_r<-var(universe)
var_r
r_sd<-sd(universe)
r_sd
# They have automatic Bessels correction :
variance * n/(n-1) == var_r # Bessels correction using * n/(n-1)
r_sd == sqrt(variance * n/(n-1) )