当前位置: 首页 > 知识库问答 >
问题:

生成0到1范围内的正态分布数据

傅振濂
2023-03-14

我正在做关于收入分配的项目……我想生成随机数据来测试这个理论。假设我有N=5个国家,每个国家有n=1000人口,我想为每个人口中的每个人生成随机收入(NORMAL DISTRIBUTION),收入约束在0到1之间,所有国家的均值和DIFFERENT均方差。我使用函数rNorm(n, Memex, sd)来做这件事。我知道统一分布(runif(n, min, max)有一些设置min, max的参数,但没有rNorm。因为rNorm没有提供设置min和max值的参数。我必须写一段html" target="_blank">代码来检查随机数据集,看看它们是否满足我的[0,1]约束。

我成功地生成了n=100的收入数据。但是,如果我将n=k乘以100,例如n=200、300……1000。我的程序将挂起。我可以看到为什么程序挂起,因为它只是随机生成数据,没有最小值和最大值的约束。因此,当我使用较大的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)
}

共有3个答案

海典
2023-03-14

这是我的看法。

首先对数据进行归一化(在此阶段标准偏差丢失)。之后,将其安装到由<code>下

#' Creates a random normal distribution within the specified bounds
#' 
#' WARNING: This function does not preserve the standard deviation
#' @param n The number of values to be generated
#' @param mean The mean of the distribution
#' @param sd The standard deviation of the distribution
#' @param lower The lower limit of the distribution
#' @param upper The upper limit of the distribution
rtnorm <- function(n, mean = 0, sd = 1, lower = -1, upper = 1){
    mean = ifelse(test = (is.na(mean)|| (mean < lower) || (mean > upper)),
                  yes = mean(c(lower, upper)),
                  no = mean)
    data <- rnorm(n, mean = mean, sd = sd) # data

    if (!is.na(lower) && !is.na(upper)){ # adjust data to specified range
        drange <- range(data)            # data range
        irange <- range(lower, upper)    # input range
        data <- (data - drange[1]) / (drange[2] - drange[1]) # normalize data (make it 0 to 1)
        data <- (data * (irange[2] - irange[1])) + irange[1] # adjust to specified range
    }
    return(data)
}

例子:

a <- rtnorm(n = 1000, lower = 10, upper = 90)
range(a)
plot(hist(a, 50))
蔺昊穹
2023-03-14

您可以规范化数据:

x = rnorm(100)

# normalize
min.x = min(x)
max.x = max(x)

x.norm = (x - min.x)/(max.x - min.x)
print(x.norm)
酆君墨
2023-03-14

这里有一个合理的简单方法…

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)
 类似资料:
  • 问题内容: 我有一个问题,我想使用概率分布生成一组1到5之间的随机整数值。 泊松和逆伽玛是两个分布,它们显示了我所追求的特征(多数情况下为平均值,较少的较高数)。 我正在使用Apache Commons Math,但不确定如何使用可用的分布来生成所需的数字。 问题答案: 从问题描述中,听起来好像您实际上想要从离散的概率分布中生成样本,并且您可以将其用于此目的。为每个整数选择适当的概率,也许类似以下

  • 问题内容: 问题 I的 特定实例 的int范围是1-100。我想在此范围内生成n个总数,这些总数应 尽可能均匀地分布, 并包括第一个和最后一个值。 例 我目前所拥有的 实际上是一种可行的方法,但是我一直觉得自己在想这个问题,而错过了一些更简单的方法?这是最有效的方法还是可以改进? 请注意,我确保此函数将始终至少返回范围的下限值和上限值。所以,我强迫 仅作为搜索参考,我正在使用它来从渲染的序列中采样

  • 我想生成一个均值为120,标准差为20的正态分布。但是我需要将这些值限制在[0,150]。我该怎么办?

  • 问题内容: 我需要生成一个范围内的随机唯一数字吗?怎么做 ? 我可以通过生成随机数 我知道这段代码不好,所以我需要一个更好的优化版本代码!帮帮我 ! 例如:如果我需要在1到15之间生成3个数字,它们应该像5、9、1而不是3,1,2 [具有1-3(我要生成的数字)] 问题答案: 以随机顺序排列数字范围的数组: 包装功能: 例: 结果:

  • 本文向大家介绍Java 生成给定范围内的随机数,包括了Java 生成给定范围内的随机数的使用技巧和注意事项,需要的朋友参考一下 为了生成给定范围内的随机数,Java代码如下- 示例 输出结果 名为Demo的类包含主要功能。在这里,将创建一个新的随机实例以及一个新的数组列表。创建随机元素并将其分配给变量。使用add函数将这些随机变量添加到列表中。这些元素显示在控制台上。

  • 问题内容: 我知道如何在Python范围内生成随机数。 我知道我可以将其循环生成n个数量的这些数字 但是,我需要确保该列表中的每个数字都是唯一的。除了大量的条件语句之外,还有一种直接的方法可以生成n个唯一的随机数吗? 重要的是列表中的每个数字都不同。 所以 [12,5,6,1] =好 但 [12,5,5,1] =不好,因为数字5出现两次。 问题答案: 如果您只需要采样而无需更换: random.s