gpt4 book ai didi

r - 生成范围 0 和 1 内的正态分布数据

转载 作者:行者123 更新时间:2023-12-04 12:01:20 25 4
gpt4 key购买 nike

我正在做我的关于收入分配的项目……我想生成随机数据来测试这个理论。假设我有 N=5 个国家,每个国家有 n=1000 人口,我想为每个人口中的每个人产生随机收入(正常分配),收入约束介于 0 和 1 之间,并且具有相同的平均值和不同的标准所有国家的偏差。我使用函数 rnorm(n, meanx, sd) 来做到这一点。我知道 UNIFORM DISTRIBUTION (runif(n,min, max) 有一些设置 min、max 的参数,但没有 rnorm。由于 rnorm 不提供设置最小值和最大值的参数。我必须写一段代码检查随机数据集,看看它们是否满足我的 [0,1] 约束。

我成功生成了 n=100 的收入数据。但是,如果我增加 n = k 倍 100,例如。 n=200, 300 ......1000。我的程序挂了。我可以理解为什么程序会挂起,因为它只是随机生成数据,没有 min、max 的限制。因此,当我使用较大的 n 时,我将成功生成的概率小于 n=100。循环再次运行:生成数据,检查失败。

从技术上讲,为了解决这个问题,我想把 n=1000 分成小批量,比如 b=100。由于 rnorm 成功生成范围为 [0,1] 的 100 个样本并且它是正常分布,如果我为每批 100 个样本分别运行 10 个 100 个样本的循环,它将运行良好。然后,我将所有 10 * 100 个样本的数据收集到一个 1000 个数据中,以供稍后分析。
但是,从数学上讲,我不确定通过这种方式是否仍然满足 n=1000 的正态分布约束。我在这里附上了我的代码。希望我的解释对你来说很清楚。你的所有意见都会对我的工作非常有用。非常感谢。

 # Update: 
# plot histogram
# create the random data with same mean, different standard deviation and x in range [0,1]

# Generate the output file
# Generate data for K countries
#---------------------------------------------
# Configurable variables
number_of_populations = 5
n=100 #number of residents (*** input the number whish is k times of 100)
meanx = 0.7
sd_constant = 0.1 # sd = sd_constant + j/50

min=0 #min income
max=1 #max income

#---------------------------------------------
batch =100 # divide the large number of residents into small batch of 100

x= matrix(
0, # the data elements
nrow=n, # number of rows
ncol=number_of_populations, # number of columns
byrow = TRUE) # fill matrix by rows

x_temp = rep(0,n)
# generate income data randomly for each country
for (j in 1:number_of_populations){
# 1. Generate uniform distribution
#x[,j] <- runif(n,min, max)
# 2. Generate Normal distribution
sd = sd_constant+j/50

repeat
{
{
x_temp <- rnorm(n, meanx, sd)
is_inside = TRUE
for (i in 1:n){
if (x_temp[i]<min || x_temp[i] >max) {
is_inside = FALSE
break
}
}
}
if(is_inside==TRUE) {break}
} #end repeat

x[,j] <- x_temp

}


# write in csv
# each column stores different income of its residents
working_dir= "D:\\dataset\\"
setwd(working_dir)

file_output = "random_income.csv"
sink(file_output)

write.table(x,file=file_output,sep=",", col.names = F, row.names = F)
sink()
file.show(file_output) #show the file in directory

#plot histogram of x for each population
#par(mfrow=c(3,3), oma=c(0,0,0,0,0))
attach(mtcars)
par(mfrow=c(1,5))
for (j in 1:number_of_populations)
{
#plot(X[,i],y,'xlab'=i)
hist(x[,j],main="Normal",'xlab'=j)
}

最佳答案

这是一个明智的简单方法......

sampnorm01 <- function(n) qnorm(runif(n,min=pnorm(0),max=pnorm(1)))

测试一下:
mysamp <- sampnorm01(1e5)
hist(mysamp)

感谢@PatrickPerry,这里是一个广义的截断法线,再次使用逆 CDF 方法。它允许在正常和不同截断边界上使用不同的参数。
rtnorm <- function(n, mean = 0, sd = 1, min = 0, max = 1) {
bounds <- pnorm(c(min, max), mean, sd)
u <- runif(n, bounds[1], bounds[2])
qnorm(u, mean, sd)
}

测试一下:
mysamp <- rtnorm(1e5, .7, .2)
hist(mysamp)

关于r - 生成范围 0 和 1 内的正态分布数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19758839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com