Esta questão é motivada pela minha pergunta sobre meta-análise . Mas imagino que também seria útil no ensino de contextos em que você deseja criar um conjunto de dados que espelhe exatamente um conjunto de dados publicado existente.
Eu sei como gerar dados aleatórios a partir de uma determinada distribuição. Por exemplo, se eu li sobre os resultados de um estudo que teve:
- uma média de 102,
- um desvio padrão de 5,2 e
- uma amostra de 72.
Eu poderia gerar dados semelhantes usando rnorm
em R. Por exemplo,
set.seed(1234)
x <- rnorm(n=72, mean=102, sd=5.2)
Obviamente, a média e o DP não seriam exatamente iguais a 102 e 5,2, respectivamente:
round(c(n=length(x), mean=mean(x), sd=sd(x)), 2)
## n mean sd
## 72.00 100.58 5.25
Em geral, estou interessado em como simular dados que satisfaçam um conjunto de restrições. No caso acima, as restrições são tamanho da amostra, média e desvio padrão. Em outros casos, pode haver restrições adicionais. Por exemplo,
- um mínimo e um máximo nos dados ou na variável subjacente podem ser conhecidos.
- sabe-se que a variável assume apenas valores inteiros ou apenas valores não negativos.
- os dados podem incluir várias variáveis com inter-correlações conhecidas.
Questões
- Em geral, como posso simular dados que satisfazem exatamente um conjunto de restrições?
- Existem artigos escritos sobre isso? Existem programas no R que fazem isso?
- Por uma questão de exemplo, como posso e devo simular uma variável para que ela tenha uma média e um sd específicos?
fonte
x<-rnorm(72);x<-5.2*(x-mean(x))/sd(x)+102
faz o truque.Respostas:
Em geral, para tornar sua amostra média e variação exatamente igual a um valor pré-especificado, você pode alterar e dimensionar adequadamente a variável. Especificamente, se é uma amostra, então as novas variáveisX1,X2,...,Xn
onde é a média da amostraes 2 X =1X¯¯¯¯=1n∑ni=1Xi é a variância da amostra são tais que a média da amostra doZi's é exactamentec2e a sua variância da amostra é exactamentec1. Um exemplo de construção semelhante pode restringir o intervalo -s2X=1n−1∑ni=1(Xi−X¯¯¯¯)2 Zi c2 c1
produzirá um conjunto de dados restrito ao intervalo . ( a , b )B1,...,Bn (a,b)
Nota: Esses tipos de mudança / dimensionamento, em geral, alteram a família de distribuição dos dados, mesmo que os dados originais venham de uma família de escala de local.
Dentro do contexto da distribuição normal, a
mvrnorm
função inR
permite simular dados normais (ou normais multivariados) com uma média / covariância amostral pré-especificada por configuraçãoempirical=TRUE
. Especificamente, essa função simula dados da distribuição condicional de uma variável normalmente distribuída, considerando que a média da amostra e (co) variância é igual a um valor pré-especificado . Observe que as distribuições marginais resultantes não são normais, como apontado por @whuber em um comentário à questão principal.Aqui está um exemplo simples e univariado, em que a média da amostra (de uma amostra de ) é restrita a 0 e o desvio padrão da amostra é 1. Podemos ver que o primeiro elemento é muito mais semelhante a uma distribuição uniforme do que uma normal distribuição:n=4
fonte
Em relação à sua solicitação de trabalhos, há:
Isso não é exatamente o que você está procurando, mas pode servir como fonte para o moinho.
Há outra estratégia que ninguém parece ter mencionado. É possível gerar dados aleatórios (pseudo) a partir de um conjunto de tamanho modo que todo o conjunto atenda às restrições , desde que os dados restantes sejam fixados em valores apropriados. Os valores exigidos devem ser solucionáveis com um sistema de equações, álgebra e alguma graxa de cotovelo.N−k N k k k
Por exemplo, para gerar um conjunto de dados a partir de uma distribuição normal que terá uma dada média da amostra, , e a variância, , será necessário corrigir os valores de dois pontos: e . Como a média da amostra é: deve ser: A variação da amostra é: assim (após substituir o acima por , frustrar / distribuir e reorganizar ... ) Nós temos:N x¯ s2 y z
R
Há algumas coisas para entender sobre essa abordagem. Primeiro, não é garantido que funcione. Por exemplo, é possível que as suas iniciais dados são tais que não os valores e existentes que fará com que a variância dos resultantes definidas iguais . Considerar: y z s 2N−2 y z s2
Segundo, enquanto a padronização torna as distribuições marginais de todas as suas variáveis mais uniformes, essa abordagem afeta apenas os dois últimos valores, mas distorce suas distribuições marginais:
Terceiro, a amostra resultante pode não parecer muito normal; pode parecer que tem 'outliers' (ou seja, pontos que provêm de um processo de geração de dados diferente do restante), já que esse é basicamente o caso. É menos provável que seja um problema com tamanhos de amostra maiores, pois as estatísticas da amostra dos dados gerados devem convergir para os valores necessários e, portanto, precisam de menos ajustes. Com amostras menores, você sempre pode combinar essa abordagem com um algoritmo de aceitação / rejeição que tenta novamente se a amostra gerada tiver estatísticas de forma (por exemplo, assimetria e curtose) que estão fora dos limites aceitáveis (cf., comentário do @ cardinal ) ou estender esta abordagem para gerar uma amostra com média fixa, variância, assimetria ecurtose (eu vou deixar a álgebra para você, no entanto). Como alternativa, você pode gerar um pequeno número de amostras e usar aquela com a menor (digamos) estatística Kolmogorov-Smirnov.
fonte
A técnica geral é o 'Método de rejeição', no qual você apenas rejeita resultados que não atendem às suas restrições. A menos que você tenha algum tipo de orientação (como o MCMC), poderá gerar muitos casos (dependendo do cenário) que são rejeitados!
Onde você está procurando algo como um desvio médio e padrão e pode criar algum tipo de métrica de distância para dizer a que distância está de seu objetivo, pode usar a otimização para procurar as variáveis de entrada que fornecem a saída desejada valores.
Como um exemplo feio, onde procuraremos um vetor uniforme aleatório com comprimento 100 que tenha média = 0 e desvio padrão = 1.
fonte
O pacote Runuran R contém muitos métodos para gerar variáveis aleatórias. Ele usa bibliotecas C do projeto UNU.RAN (gerador de número de uniforme universal não uniforme). Meu próprio conhecimento do campo da geração aleatória de variáveis é limitado, mas a vinheta de Runuran fornece uma boa visão geral. Abaixo estão os métodos disponíveis no pacote Runuran, retirados da vinheta:
Distribuições contínuas:
Distribuições discretas:
Distribuições multivariadas:
Exemplo:
Para um exemplo rápido, suponha que você deseje gerar uma distribuição Normal limitada entre 0 e 100:
A
urnorm()
função é uma função de invólucro conveniente. Eu acredito que nos bastidores ele usa o método de interpolação polinomial de CDF inverso, mas não tenho certeza. Para algo mais complexo, digamos, uma distribuição Normal discreta limitada entre 0 e 100:fonte
Parece que há um pacote R atendendo aos seus requisitos publicado ontem! simstudy Por Keith Goldfeld
fonte
Esta é uma resposta que chega tão tarde que, presumivelmente, não tem sentido, mas sempre há uma solução para o MCMC. Ou seja, para projetar a densidade da junta da amostra no coletor definido pelas restrições, por exemplo A única questão é simular valores sobre essa variedade, ou seja, encontrar uma parametrização da dimensão correta. Um artigo de 2015 de Bornn, Shephard e Solgi estuda esse mesmo problema (com uma resposta interessante, se não definitiva ).
fonte
Esta resposta considera outra abordagem para o caso em que você deseja forçar as variáveis a ficarem em um intervalo especificado e, adicionalmente, ditar a média e / ou variação.
Restrinja nossa atenção ao intervalo da unidade . Vamos usar uma média ponderada para generalidade, portanto, fixe alguns pesos com ou defina se desejar uma ponderação padrão. Suponha que as quantidades e representem a média (ponderada) desejada e a variação (ponderada), respectivamente. O limite superior em é necessário porque essa é a variação máxima possível em um intervalo de unidades. Estamos interessados em desenhar algumas variáveis de com essas restrições de momento.[0,1] wk∈[0,1] ∑Nk=1wk=1 wk=1/N μ∈(0,1) 0<σ2<μ(1−μ) σ2 x1,...,xN [0,1]
Primeiro, desenhamos algumas variáveis de qualquer distribuição, como . Essa distribuição afetará o formato da distribuição final. Em seguida, as restringimos ao intervalo unitário usando uma função logística:y1,...,yN N(0,1) [0,1]
Antes de fazermos isso, no entanto, como visto na equação acima, transformamos os 's com a tradução escala . Isso é análogo à primeira equação na resposta do @ Macro. O truque é agora de escolher e , para que as variáveis transformadas têm o momento desejado (s). Ou seja, exigimos um ou ambos dos seguintes :yk h v h v x1,...,xN
A inversão dessas equações para e analiticamente não é viável, mas fazê-lo numericamente é simples, especialmente porque derivadas com relação a e são fáceis de calcular; são necessárias apenas algumas iterações do método de Newton.v h v h
Como primeiro exemplo, digamos que apenas nos preocupamos em restringir a média ponderada e não a variação. Correção , , , . Então, para as distribuições subjacentes , e , terminamos com os seguintes histogramas, respectivamente, e de modo que a média das variáveis seja exatamente (mesmo para pequeno ):v = 1 w k = 1 / N N = 200000 N ( 0 , 1 ) N ( 0 , 0,1 ) Unif ( 0 , 1 ) 0,8 Nμ=0.8 v=1 wk=1/N N=200000 N(0,1) N(0,0.1) Unif(0,1) 0.8 N
Em seguida, vamos restringir a média e a variância. Tome , , e considere os três desvios padrão desejados . Usando a mesma distribuição subjacente , aqui estão os histogramas para cada:w k = 1 / N N = 2000 σ = 0,1 , 0,05 , 0,01 N ( 0 , 1 )μ=0.2 wk=1/N N=2000 σ=0.1,0.05,0.01 N(0,1)
Observe que eles podem parecer um pouco distribuídos em beta, mas não são.
fonte
Na minha resposta aqui , listei três pacotes R para fazer isso:
fonte