
Amigos Eu tenho um conjunto de dados com a média da idade dos participantes e o desvio padrão da mesma e gostaria de gerar a distribuição dessas idades para que eu possa obter a proporção de uma determinada faixa etária. Eu fiz a função abaixo: prop <- function(x){ for (i in 1:nrow(x)) z[i]=rnorm(x$npart[i], mean = x$idade[i],sd =x$sd[i]) z y = ifelse(z < 45,"menor de 45 anos","maior de 45 anos") tabela <- table(y) tabela <- round(prop.table(tabela)*100,2) resultado <- tabela[2] print(resultado)} Onde npart é o número total de participantes. O que tenho que modificar nessa função para que eu possa obter os resultados? Att -- Sérgio Henrique Almeida da Silva Junior Doutorando em Epidemiologia em Saúde Pública Escola Nacional de Saúde Pública Sérgio Arouca - ENSP/FIOCRUZ http://lattes.cnpq.br/1611345552843383 Tel: (21) 68463637 http://www.linkedin.com/profile/view?id=250437145&trk=tab_pro

Sérgio, bom dia! Teria um set de dados pra rodar o CMR? De antemão parece haver problema na execução da rnorm() cuja saída está sendo alocada em um objeto indexado que ainda não existe ('z'). A cada ciclo do for será gerada uma linha com 'npart' elementos e imagino que você queira acumular as saídas, mas essa não é a forma correta. Pode funcionar definindo z como uma lista e adicionando a saída em cada ciclo do for. Trabalhando só no primeiro trecho pensei em algo assim... ### <BEGIN> ### não testado! prop <- function(x){ z <- list(NULL) for (i in 1:nrow(x)) { z[i]=list(rnorm(x$npart[i], mean=x$idade[i], sd=x$sd[i]))} return(z) } ### <END> Desse ponto seria só prosseguir com os cálculos utilizando cada 'linha' da lista. Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]

Se você tem média e desvio-padrão e acredita que X, sua variável aleatória, tem esses valores como parâmetros de uma distribuição normal, você não precisa simular e calcular frequências, use direto as probabilidades teóricas e multiplique pelo número de pessoas. Ou seja, ## Seja X ~ Normal(mean=2, dp=1). ## Qual P(X>2.5)? ## Se n = 100, qual esperado para n*(X>2.5)? E = n*p ## por simulação (sujeito à erro Monte Carlo), ## vai convergir quando n for para infinito. x <- rnorm(100, 2, 1) table(x>2.5) ## por teoria 100*pnorm(2.5, 2, 1, lower.tail=FALSE) Você tá assumindo uma distribuição teórica a partir da qual pode-se usar, portanto, os resultados teóricos mas tá resolvendo o problema na força bruta, simulando da variável e obtendo a distribuição de frequência. É como se você tivesse uma moto pronta para andar mas resolveu retirar o seu motor e adaptar em uma bicicleta. Vai te custar tempo, não vai funcionar igual, não vai ser tão rápido nem tão seguro, quem ver vai achar esquisito e te encher de perguntas, muito embora você vai de A para B nessa bicicleta. Mas você não precisa fazer isso. Vá de moto. À disposição. Walmes.

Obrigado pela dica Walmes. O que você sugere para eu obter esses dados? Simulação MC? Eu gostaria de colocar isso dentro de uma função para que eu possa obter esse resultado para um conjunto grande de valores. Segue um exemplo: idade=c(40,45,50,55,60,65,60,30,35,22) sd=c(10.2,15.1,6,6.5,10,12.5,8,9,9.5,10) npart=c(1000,100,1500,10000,500,200,300,400,500,150) dados = cbind(as.data.frame(idade),as.data.frame(sd),as.data.frame(npart)) Ficaria assim a função? prop <- function(x){ for (i in 1:nrow(x)) z[i]=100*pnorm(45, x$idade[i], x$sd[i], lower.tail=FALSE) resultado <- z print(resultado)} prop(dados) Mas ainda não estou obtendo os valores o que preciso modificar nessa função. Em 30 de novembro de 2013 12:29, walmes . <walmeszeviani@gmail.com>escreveu:
Se você tem média e desvio-padrão e acredita que X, sua variável aleatória, tem esses valores como parâmetros de uma distribuição normal, você não precisa simular e calcular frequências, use direto as probabilidades teóricas e multiplique pelo número de pessoas. Ou seja,
## Seja X ~ Normal(mean=2, dp=1). ## Qual P(X>2.5)? ## Se n = 100, qual esperado para n*(X>2.5)? E = n*p
## por simulação (sujeito à erro Monte Carlo), ## vai convergir quando n for para infinito. x <- rnorm(100, 2, 1) table(x>2.5)
## por teoria 100*pnorm(2.5, 2, 1, lower.tail=FALSE)
Você tá assumindo uma distribuição teórica a partir da qual pode-se usar, portanto, os resultados teóricos mas tá resolvendo o problema na força bruta, simulando da variável e obtendo a distribuição de frequência. É como se você tivesse uma moto pronta para andar mas resolveu retirar o seu motor e adaptar em uma bicicleta. Vai te custar tempo, não vai funcionar igual, não vai ser tão rápido nem tão seguro, quem ver vai achar esquisito e te encher de perguntas, muito embora você vai de A para B nessa bicicleta. Mas você não precisa fazer isso. Vá de moto.
À disposição. Walmes.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Sérgio Henrique Almeida da Silva Junior Doutorando em Epidemiologia em Saúde Pública Escola Nacional de Saúde Pública Sérgio Arouca - ENSP/FIOCRUZ http://lattes.cnpq.br/1611345552843383 Tel: (21) 68463637 http://www.linkedin.com/profile/view?id=250437145&trk=tab_pro
participantes (3)
-
Sérgio Henrique almeida da silva ju
-
walmes .
-
Éder Comunello