특정 평균 및 표준 편차와 같은 특정 제약 조건을 충족하는 데이터를 시뮬레이션하는 방법은 무엇입니까?


56

이 질문은 메타 분석에 대한 나의 질문에 의해 동기가 부여됩니다 . 그러나 기존 게시 된 데이터 집합을 정확하게 미러링하는 데이터 집합을 만들려는 컨텍스트를 가르치는데도 유용하다고 생각합니다.

주어진 분포에서 무작위 데이터를 생성하는 방법을 알고 있습니다. 예를 들어 다음과 같은 연구 결과에 대해 읽은 경우 :

  • 평균 102,
  • 표준 편차 5.2
  • 72의 샘플 크기.

rnormR을 사용하여 비슷한 데이터를 생성 할 수 있습니다 . 예를 들어

set.seed(1234)
x <- rnorm(n=72, mean=102, sd=5.2)

물론 평균과 SD는 각각 102와 5.2와 정확히 같지 않습니다.

round(c(n=length(x), mean=mean(x), sd=sd(x)), 2)
##     n   mean     sd 
## 72.00 100.58   5.25 

일반적으로 일련의 제약 조건을 만족하는 데이터를 시뮬레이션하는 방법에 관심이 있습니다. 위의 경우, 구속은 표본 크기, 평균 및 표준 편차입니다. 다른 경우에는 추가 제한 조건이있을 수 있습니다. 예를 들어

  • 데이터 또는 기본 변수의 최소값과 최대 값을 알 수 있습니다.
  • 변수는 정수 값 또는 음이 아닌 값만 취하는 것으로 알려져 있습니다.
  • 데이터는 상관 관계가 알려진 여러 변수를 포함 할 수 있습니다.

질문

  • 일반적으로 일련의 제약 조건을 정확히 만족시키는 데이터를 어떻게 시뮬레이션 할 수 있습니까?
  • 이것에 관한 기사가 있습니까? 이 작업을 수행하는 프로그램이 R에 있습니까?
  • 예를 들어, 변수가 특정 평균과 sd를 갖도록 어떻게 시뮬레이션 할 수 있습니까?

1
왜 게시 된 결과와 정확히 같기를 원합니까? 데이터 표본을 고려할 때 이러한 모집단 평균 및 표준 편차 추정치가 아닙니다. 이 추정치의 불확실성을 감안할 때, 위에 표시된 표본이 관측치와 일치하지 않는다고 말하는 사람은 누구입니까?
Gavin Simpson

4
이 질문은 마크 (IMHO)를 놓치는 답글을 수집하는 것으로 보이므로, 개념적으로 답은 간단합니다. 평등 구속 조건은 한계 분포처럼 취급되고 불평등 제약 조건은 다변량 잘림의 유사체입니다. 잘림은 처리하기가 비교적 쉽습니다 (종종 거부 샘플링으로). 더 어려운 문제는 이러한 한계 분포를 샘플링하는 방법을 찾는 데 있습니다. 이는 분포와 구속 조건이 주어지면 한계 값을 샘플링하거나 한계 분포와 샘플링 값을 찾기 위해 통합하는 것을 의미합니다.
whuber

4
BTW, 마지막 질문은 위치 규모 분포 제품군에있어 사소한 문제입니다. 예를 들어, x<-rnorm(72);x<-5.2*(x-mean(x))/sd(x)+102트릭을 수행합니다.
whuber

1
@whuber는 추기경이 내 대답에 대한 주석 (이 "트릭"을 언급 함)과 다른 대답에 대한 주석을 암시합니다-일반적 으로이 방법은 일반적으로 동일한 분포 패밀리 내에 변수를 유지하지 않습니다. 표본 표준 편차에 의해
Macro

5
@ 매크로 이것은 좋은 지적이지만 아마도 가장 좋은 대답은 "물론 같은 분포를 가지지 않을 것입니다!"입니다. 원하는 분포 는 구속 조건 에 따른 분포 입니다. 일반적으로 부모 배포와 같은 가족이 아닙니다. 예를 들어, 정규 분포에서 추출한 평균 0 및 SD 1을 갖는 크기 4의 표본의 각 요소는 [-1.5, 1.5]에서 거의 균일 한 확률 을 갖 습니다. 조건이 가능한 값에 상한과 하한을 배치하기 때문입니다.
whuber

답변:


26

X1,X2,...,Xn

Zi=c1(XiX¯sX)+c2

X¯=1ni=1nXisX2=1n1i=1n(XiX¯)2Zic2c1

Bi=a+(ba)(Ximin({X1,...,Xn})max({X1,...,Xn})min({X1,...,Xn}))

간격 제한된 데이터 세트 을 생성합니다 . ( a , b )B1,...,Bn(a,b)

참고 : 이러한 유형의 이동 / 확장은 일반적으로 원본 데이터가 위치 규모 패밀리에서 나온 경우에도 데이터의 분포 패밀리를 변경합니다.

정규 분포 의 맥락 에서 mvrnorm함수를 R 사용하면을 설정 하여 미리 지정된 표본 평균 / 공분산으로 정규 (또는 다변량 정규) 데이터를 시뮬레이션 할 수 있습니다 empirical=TRUE. 특히,이 함수 는 표본 평균 및 (공) 분산이 사전 지정된 값과 같을 때 정규 분포 변수조건부 분포 에서 데이터를 시뮬레이션 합니다 . 주요 질문에 대한 주석에서 @whuber가 지적한 것처럼 결과 한계 분포는 정상 이 아닙니다 .

다음은 표본 평균 ( 의 표본 )이 0으로 제한되고 표본 표준 편차가 1 인 간단한 일 변량 예제 입니다. 첫 번째 요소는 정규 분포보다 균일 분포와 훨씬 더 유사합니다. 분포:n=4

library(MASS)
 z = rep(0,10000)
for(i in 1:10000)
{
    x = mvrnorm(n = 4, rep(0,1), 1, tol = 1e-6, empirical = TRUE)
    z[i] = x[1]
}
hist(z, col="blue")

                  여기에 이미지 설명을 입력하십시오


1
표본의 크기가 큰 경우에, 그래서 그들은 약이 될 수 있지만 일반적으로 분산되지 않습니다. @Sean의 답변에 대한 첫 번째 의견은 이것을 암시합니다. Zi
추기경

1
글쎄, 그것은하고 싶은 아주 자연스러운 일이다. 그리고 종종 너무 많은 문제를 일으키지 않는다 .
추기경

1
+1. 예에서, 균일는이다 정확한 방법으로, 대답. (플롯의 끝에서 명백한 드롭 오프는 R이 히스토그램을 그리는 방법의 인공물입니다.)
whuber

1
@ whuber,이 예제에 동기를 부여해 주셔서 감사합니다. 표본 평균 / 분산에 대해 조건을 지정하면 한계 분포가 변경된다는 사실을 고려할 때, OP 질문의 정신에서 최상의 "답변"은 표본으로보고 된 것과 같은 모집단 평균 / 분산으로 데이터를 시뮬레이션하는 것 같습니다. 수량 (OP 자체에서 제안한대로) 그렇지 않습니까? 이렇게하면 원하는 샘플 수량과 "유사한"샘플 수량을 얻을 수 있으며 한계 분포는 원하는 것입니다.
매크로

1
@whuber, 표본이 정상이면 에 가 있습니다 . 문제의 "새로운"변수는 의 선형 조합 일뿐 입니다. t T iTi=(XiX¯)/stTi
매크로

22

논문 요청과 관련하여 다음이 있습니다.

이것은 당신이 찾고있는 것이 아니지만 제 분소를 위해 가장 어리석은 역할을 할 수 있습니다.


아무도 언급하지 않은 다른 전략이 있습니다. 나머지 데이터가 적절한 값으로 고정 되는 한 전체 세트가 제약 조건을 만족하도록 크기 의 세트로부터 (의사) 랜덤 데이터 를 생성하는 것이 가능하다 . 필요한 값은 방정식, 대수 및 팔꿈치 그리스 시스템으로 해결할 수 있어야합니다 . N k k kNkNkkk

예를 들어, 주어진 표본 평균 및 분산 가있는 정규 분포에서 데이터 세트를 생성 하려면 와 의 두 점 값을 수정해야합니다 . 샘플 평균은 다음과 같습니다. 는 다음과 같아야합니다. 표본 분산은 다음과 같습니다. ( 위의 내용으로 바꾸고, 호일 / 배포, 재배 열한 후 ... ) 우리는 얻는다 : Nx¯s2yz

x¯=i=1N2xi+y+zN
y
y=Nx¯(i=1N2xi+z)
s2=i=1N2(xix¯)2+(yx¯)2+(zx¯)2N1
y
2(Nx¯i=1N2xi)z2z2=Nx¯2(N1)+i=1N2xi2+[i=1N2xi]22Nx¯i=1N2xi(N1)s2
우리가 걸리는 경우 , 및 를 RHS의 부정으로 , 2 차 공식을 사용하여 대해 풀 수 있습니다 . 예를 들어에서 다음 코드를 사용할 수 있습니다. a=2b=2(Nx¯i=1N2xi)czR
find.yz = function(x, xbar, s2){
  N    = length(x) + 2
  sumx = sum(x)
  sx2  = as.numeric(x%*%x)          # this is the sum of x^2
  a    = -2
  b    = 2*(N*xbar - sumx)
  c    = -N*xbar^2*(N-1) - sx2 - sumx^2 + 2*N*xbar*sumx + (N-1)*s2
  rt   = sqrt(b^2 - 4*a*c)

  z    = (-b + rt)/(2*a)
  y    = N*xbar - (sumx + z)
  newx = c(x, y, z)
  return(newx)
}

set.seed(62)
x    = rnorm(2)
newx = find.yz(x, xbar=0, s2=1)
newx                                # [1] 0.8012701  0.2844567  0.3757358 -1.4614627
mean(newx)                          # [1] 0
var(newx)                           # [1] 1

이 접근법에 대해 이해해야 할 것이 있습니다. 첫째, 작동하지 않을 수 있습니다. 예를 들어, 초기 데이터는 결과 집합의 분산을 만드는 값 및 가 존재 하지 않는 것일 수 있습니다 . 치다: N2yzs2

set.seed(22)    
x    = rnorm(2)
newx = find.yz(x, xbar=0, s2=1)
Warning message:
In sqrt(b^2 - 4 * a * c) : NaNs produced
newx                                # [1] -0.5121391  2.4851837        NaN        NaN
var(c(x, mean(x), mean(x)))         # [1] 1.497324

둘째, 표준화는 모든 변수의 한계 분포를보다 균일하게 만드는 반면,이 방법은 마지막 두 값에만 영향을 미치지 만 한계 분포는 왜곡됩니다.

set.seed(82)
xScaled = matrix(NA, ncol=4, nrow=10000)
for(i in 1:10000){
  x           = rnorm(4)
  xScaled[i,] = scale(x)
}

(삽입 플롯)

set.seed(82)
xDf = matrix(NA, ncol=4, nrow=10000)
i   = 1
while(i<10001){
  x       = rnorm(2)
  xDf[i,] = try(find.yz(x, xbar=0, s2=2), silent=TRUE)  # keeps the code from crashing
  if(!is.nan(xDf[i,4])){ i = i+1 }                      # increments if worked
}

(삽입 플롯)

셋째, 결과 샘플을하지 않을 수 있습니다 보면 매우 정상; 본질적으로 그렇기 때문에 '이상 점'(즉, 나머지와 다른 데이터 생성 프로세스에서 나오는 점)이있는 것처럼 보일 수 있습니다. 생성 된 데이터의 샘플 통계가 필요한 값으로 수렴되므로 조정이 덜 필요하므로 이는 더 큰 샘플 크기에서는 문제가되지 않습니다. 더 작은 샘플을 사용하면 생성 된 샘플에 허용 범위를 벗어난 (예 : @ cardinal 's comment ) 범위를 벗어난 모양 통계 (예 : 왜도 및 첨도)가 있거나 다시 시도하는 승인 / 거부 알고리즘과이 방법을 항상 결합 할 수 있습니다. 이 방법은 고정 평균, 분산, 왜도 첨도 (하지만 나는 대수를 당신에게 맡길 것입니다). 또는 적은 수의 샘플을 생성하고 Kolmogorov-Smirnov 통계량이 가장 작은 샘플을 사용할 수 있습니다.

library(moments)
set.seed(7900)  
x = rnorm(18)
newx.ss7900 = find.yz(x, xbar=0, s2=1)
skewness(newx.ss7900)                       # [1] 1.832733
kurtosis(newx.ss7900) - 3                   # [1] 4.334414
ks.test(newx.ss7900, "pnorm")$statistic     # 0.1934226

set.seed(200)  
x = rnorm(18)
newx.ss200 = find.yz(x, xbar=0, s2=1)
skewness(newx.ss200)                        # [1] 0.137446
kurtosis(newx.ss200) - 3                    # [1] 0.1148834
ks.test(newx.ss200, "pnorm")$statistic      # 0.1326304 

set.seed(4700)  
x = rnorm(18)
newx.ss4700 = find.yz(x, xbar=0, s2=1)
skewness(newx.ss4700)                       # [1]  0.3258491
kurtosis(newx.ss4700) - 3                   # [1] -0.02997377
ks.test(newx.ss4700, "pnorm")$statistic     # 0.07707929S

(플롯 추가)


10

일반적인 기술은 '거부 방법'으로, 제약 조건을 충족하지 않는 결과 만 거부합니다. (MCMC와 같은) 어떤 종류의 지침이 없다면, (사례에 따라) 많은 경우가 거부 될 수 있습니다!

평균 및 표준 편차와 같은 것을 찾고 목표에서 얼마나 멀리 떨어져 있는지를 나타내는 거리 메트릭을 만들 수있는 경우 최적화를 사용하여 원하는 출력을 제공하는 입력 변수를 검색 할 수 있습니다 가치.

평균이 100이고 표준 편차가 1 인 길이 100의 임의의 균일 한 벡터를 찾을 수 있는 추악한 예입니다.

# simplistic optimisation example
# I am looking for a mean of zero and a standard deviation of one
# but starting from a plain uniform(0,1) distribution :-)
# create a function to optimise
fun <- function(xvec, N=100) {
  xmin <- xvec[1]
  xmax <- xvec[2]
  x <- runif(N, xmin, xmax)
  xdist <- (mean(x) - 0)^2 + (sd(x) - 1)^2
  xdist
}
xr <- optim(c(0,1), fun)

# now lets test those results
X <- runif(100, xr$par[1], xr$par[2])
mean(X) # approx 0
sd(X)   # approx 1

7
확률이 0 인 제약 조건은 충족하기 어렵습니다. ;-) 현재의 특정 예에서, 적절한 이동과 확장은 명시된 목표를 쉽게 달성 할 수 있지만, 그러한 연산에 의해 데이터의 분포가 어떻게 교란되는지 살펴보기 위해 조금 더 깊이 분석하고 싶을 수도 있습니다.
추기경

감사. 확실히 최소값보다 작고 최대 값보다 큰 관측 값을 쉽게 거부 할 수 있습니다. 그리고 최적화 문제로 어떻게 정의 할 수 있는지 알 수 있습니다. 몇 가지 예를 보거나 다음에 읽을 내용에 대한 제안을하는 것이 좋습니다.
Jeromy Anglim 2016 년

1
@ 추기경-동의했습니다. 입력 시뮬레이트 된 숫자와 출력 모두의 분포 (즉, 히스토그램)를 살펴보아야합니다.
Sean

9

이 작업을 수행하는 프로그램이 R에 있습니까?

Runuran R 패키지는 임의 variates를 생성하기위한 많은 방법이 포함되어 있습니다. UNU.RAN (Universal Non-Uniform RAndom Number Generator) 프로젝트의 C 라이브러리를 사용합니다 . 무작위 변이 생성 분야에 대한 내 지식은 제한적이지만 Runuran 삽화 는 훌륭한 개요를 제공합니다. 다음은 비 ur 트에서 가져온 Runuran 패키지에서 사용 가능한 방법입니다.

연속 분포 :

  • 적응 형 거부 샘플링
  • 역변환 밀도 제거
  • 역 CDF의 다항식 보간
  • 간단한 균등 비율 방법
  • 변형 된 밀도 제거

이산 분포 :

  • 이산 자동 거부 반전
  • Alias-Urn 방법
  • 이산 반전을위한 가이드 테이블 방법

다변량 분포 :

  • 균등 비율 방법을 사용한 적중 및 실행 알고리즘
  • 다변량 순진한 비율 비율 방법

예:

간단한 예를 들어, 0에서 100 사이의 정규 분포를 생성하려고한다고 가정합니다.

require("Runuran")

## Normal distribution bounded between 0 and 100
d1 <- urnorm(n = 1000, mean = 50, sd = 25, lb = 0, ub = 100)

summary(d1)
sd(d1)
hist(d1)

urnorm()기능은 편리한 래퍼 기능입니다. 나는 배후에서 다항식 보간법의 CDF 방법을 사용하지만 확실하지 않다고 생각합니다. 더 복잡한 것, 예를 들어 0과 100 사이의 이산 정규 분포가 있습니다.

require("Runuran")

## Discrete normal distribution bounded between 0 and 100
# Create UNU.RAN discrete distribution object
discrete <- unuran.discr.new(pv = dnorm(0:100, mean = 50, sd = 25), lb = 0, ub = 100)

# Create UNU.RAN object using the Guide-Table Method for Discrete Inversion
unr <- unuran.new(distr = discrete, method = "dgt")

# Generate random variates from the UNU.RAN object
d2 <- ur(unr = unr, n = 1000)

summary(d2)
sd(d2)
head(d2)
hist(d2)

3

어제 게시 된 요구 사항을 충족하는 R 패키지가있는 것 같습니다! Keith Goldfeld의 simstudy

모델링 기술을 탐색하거나 데이터 생성 프로세스를 더 잘 이해하기 위해 데이터 세트를 시뮬레이션합니다. 사용자는 공변량 간의 관계 집합을 지정하고 이러한 사양을 기반으로 데이터를 생성합니다. 최종 데이터 세트는 무작위 대조 시험, 반복 측정 (종 방향) 설계 및 군집 무작위 시험으로부터의 데이터를 나타낼 수 있습니다. 다양한 메커니즘 (MCAR, MAR, NMAR)을 사용하여 누락을 생성 할 수 있습니다.


1
비 네트 나 프로그램의 홈페이지에는 정확한 구속 조건에 대한 언급이 없다. 이 패키지가 조건부 분포에서 도출해야하는 요구 사항을 충족한다고 생각하는 이유는 무엇입니까?
gg

2

이 답변은 너무 늦어서 무의미 할 것 같지만 질문에 대한 MCMC 솔루션이 항상 있습니다. 즉, 제약 조건으로 정의 된 매니 폴드에 샘플 의 조인트 밀도를 투영하려면 예 : 그런 다음 유일한 문제는 해당 매니 폴드에서 값을 시뮬레이션하는 것입니다. 즉, 올바른 치수의 매개 변수를 찾는 것입니다. Bornn, Shephard 및 Solgi 의 2015 년 논문 은이 문제를 연구합니다 ( 궁극적 인 대답은 아니지만 흥미 롭습니다 ).

i=1nf(xi)
i=1nxi=μ0i=1nxi2=σ02

2

이 답변에서는 변수가 지정된 범위에있게하고 평균 및 / 또는 분산을 추가 로 지정하려는 경우에 대한 다른 접근 방법을 고려합니다 .

단위 간격 주의를 제한하십시오 . 일반성을 위해 가중 평균을 사용하겠습니다. 따라서 일부 가중치 을 로 수정하거나 표준 가중치를 원하면 설정 . 양 가정 및 는 각각, 원하는 (가중)을 나타내는 것을 의미하고 (가중치)를 분산. 상한에 그 단위 구간에 가능한 최대 편차가 있기 때문에 필요하다. 이러한 모멘트 제한으로 에서 일부 변수 을 그리는 데 관심 이 있습니다.[0,1]wk[0,1]k=1Nwk=1wk=1/Nμ(0,1)0<σ2<μ(1μ)σ2x1,...,xN[0,1]

먼저 과 같은 분포에서 일부 변수 을 그 . 이 분포는 최종 분포의 모양에 영향을 미칩니다. 그런 다음 로지스틱 함수를 사용하여 단위 간격 제한합니다 .y1,...,yNN(0,1)[0,1]

xk=11+e(ykvh)

그러나 그렇게하기 전에, 위의 방정식에서 볼 수 있듯이, 와 scale 변환 합니다. 이것은 @Macro의 답변의 첫 번째 방정식과 유사합니다. 트릭은 변환 된 변수 이 원하는 모멘트를 갖도록 와 를 선택 하는 것 입니다. 즉, 다음 중 하나 또는 둘 모두를 보유해야합니다. ykhvhvx1,...,xN

μ=k=1Nwk1+e(ykvh)σ2=k=1Nwk(1+e(ykvh))2(k=1Nwk1+e(ykvh))2

및 대한 이러한 방정식을 분석적으로 뒤집는 것은 가능하지 않지만, 특히 및 대한 미분이 계산하기 쉽기 때문에 수치 적 으로 계산하는 것이 간단합니다. 뉴턴의 방법을 몇 번만 반복하면됩니다.vhvh

첫 번째 예로, 분산이 아닌 가중 평균의 제한에만 관심이 있다고 가정 해 봅시다. 수정 , , , . 그런 다음 기본 분포 , 및 대해 각각 다음 히스토그램으로 끝나고 변이의 평균이 정확히 (작은 조차도 ) :v = 1 w k = 1 / N N = 200000 N ( 0 , 1 ) N ( 0 , 0.1 ) Unif ( 0 , 1 ) 0.8 Nμ=0.8v=1wk=1/NN=200000N(0,1)N(0,0.1)Unif(0,1) 0.8N

예 1

다음으로 평균과 분산을 모두 구속합시다. 가라 , , 및 세 원하는 표준 편차를 고려 . 동일한 기본 분포 사용하여 각각에 대한 히스토그램은 다음과 같습니다.w k = 1 / N N = 2000 σ = 0.1 , 0.05 , 0.01 N ( 0 , 1 )μ=0.2wk=1/NN=2000σ=0.1,0.05,0.01N(0,1)

실시 예 2

이것들은 약간 베타 배포 된 것처럼 보일 수 있지만 그렇지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.