2013-04-26 60 views
3

我試圖創建一個數據集的隨機生成具有一些特定的屬性值:的R - 用整數隨機近似正態分佈預定義的總

  • 所有的正整數比0
  • 更大的兩列(X,Y)具有相等的金額(SUM(x)的==總和(Y))
  • 具有大致正態分佈

我成功的東西,產生的數據接近我想要的東西,但它非常緩慢。由於while循環,我懷疑它很慢。

simSession <- function(sessionid = 1) { 
    s <- data.frame(sessionid = sessionid, userid = seq(1:12)) 
    total <- sample(48:72, 1) 

    mu = total/4 
    sigma = 3 

    s$x <- as.integer(rnorm(mean=mu, sd=sigma, n=nrow(s))) 
    while(sum(s$x) > total) { 
     # i <- sample(nrow(s), 1) 
     i <- sample(rep(s$userid, s$x), 1) 
     if(s[i, ]$x > 1) { 
      s[i, ]$x <- s[i, ]$x - 1 
     } else { 
      s[i, ]$x = 1 
     } 
    } 

    s$y <- as.integer(rnorm(mean=mu, sd=sigma, n=nrow(s))) 
    while(sum(s$y) > sum(s$x)) { 
     # i <- sample(nrow(s), 1) 
     i <- sample(rep(s$userid, s$y), 1) 
     if(s[i, ]$y > 1) { 
      s[i, ]$y <- s[i, ]$y - 1 
     } else { 
      s[i, ]$y = 1 
     } 
    } 

    s$xyr <- s$x/s$y 

    return(s) 
} 

是否有明顯的東西我錯過了會使這個問題更容易或替代功能會更快?

此外,還可以指定參數向左或向右傾斜模式。

回答

0

如果你不介意,期望值和方差相等,你可以使用泊松分佈:

randgen <- function(n,mu) { 
    x <- rpois(n,mu) 
    y <- rpois(n,mu) 

    d <- sum(y)-sum(x) 

    if (d<0) { 
    ind <- sample(seq_along(y),-d) 
    y[ind] <- y[ind]+1 
    } else { 
    ind <- sample(seq_along(x),d) 
    x[ind] <- x[ind]+1 
    } 

cbind(x=as.integer(x),y=as.integer(y)) 
} 

set.seed(42) 
rand <- randgen(1000,15) 

layout(c(1,2))  
qqnorm(rand[,1]); qqline(rand[,1]) 
qqnorm(rand[,2]); qqline(rand[,2]) 

enter image description here

is.integer(rand) 
#[1] TRUE 

sum(rand<0) 
#[1] 0 

colSums(rand) 
#x  y 
#15084 15084 

mean(rand[,1]) 
#[1] 15.084 
mean(rand[,2]) 
#[1] 15.084 

sd(rand[,1]) 
#[1] 4.086275 
sd(rand[,2]) 
#[1] 3.741249 
相關問題