Teste de diferça entre proporções via loop

Olá pessoal, tudo bem ? Estou querendo rodar um teste de diferença entre proporções em várias linhas do meu banco de dados, daí gostaria de saber como poderia rodar de uma vez só, através de um loop, esse comando e gerar uma coluna só com os p-valores. Veja como estõa tentando fazer abaixo: O comando seria esse: prop.test(x = c(x1, x2), n = c(n1, n2), correct = FALSE) O banco seria dessa forma: AREA X1 X2 N p_valor 1 1982 9416 11398 ? 2 6546 4084 10630 ? 3 3418 667 4085 ? 4 1503 4408 5911 ? 5 966 339 305 ? AREA1 <- prop.test(x = c(1982, 9416), n = c(11398, 11398), correct = FALSE) AREA1$p.value AREA2 <- prop.test(x = c(6546, 4084), n = c(10630, 10630), correct = FALSE) AREA2$p.value AREA3 <- prop.test(x = c(3418, 667), n = c(4085, 4085), correct = FALSE) AREA3$p.value ... Obrigado -- Wagner S. Tassinari Departamento de Matemática Universidade Federal Rural do Rio de Janeiro. BR-465, Km 7 - Seropedica, RJ - Brasil CEP: 23890-000 Skype: wagner.tassinari wtassinari@gmail.com tassinari@ufrrj.br ------------------------------------------------------- "Statistical thinking will one day be as necessary for efficient citizenship as the ability to read and write." (H.G.Wellis)

Boa tarde Wagner Supondo que seus dados esteja uma tabela data_test (em anexo) acho que você pode resolver assim data<- read.table(“data_test.txt”, header=T, sep= “\t”) data_df <- as.data.frame(data) res<- list() for (i in 1:nrow(data)) { y<- prop.test(x = c(data$X1[i], data$X2[i]), n = c(data$N[i], data$N[i]), correct = FALSE) x= y$p.value res[[paste0(i)]] <- x } result <- t(as.data.frame(res)) data_df1 <- cbind(data_df, result) data_df1 Espero que funcione daniel Daniel Tiezzi, MD, PhD Professor Associado Departamento de Ginecologia e Obstetrícia Setor de Mastologia e Oncologia Ginecológica Faculdade de Medicina de Ribeirão Preto - USP Tel.: 16 3602-2488 e-mail: dtiezzi@fmrp.usp.br
On Mar 23, 2016, at 3:50 PM, Wagner Tassinari <wtassinari@gmail.com> wrote:
AREA X1 X2 N p_valor 1 1982 9416 11398 ? 2 6546 4084 10630 ? 3 3418 667 4085 ? 4 1503 4408 5911 ? 5 966 339 305 ?

Como sugestão para um código mais enxuto, o objetivo poderia ser atingido com a aplicação da função apply:
dados <- read.table("data_test.txt", header=T, sep= "\t") dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value) dados AREA X1 X2 N p_valor 1 1 1982 9416 11398 0,000000e+00 2 2 6546 4084 10630 5,362948e-250 3 3 3418 667 40850 0,000000e+00 4 4 1503 4408 59110 0,000000e+00 5 5 966 339 30500 6,472911e-69
Ademais, se o OP tiver que resolver problemas dessa natureza com frequência, pode ser que valha a pena examinar alguns pacotes que têm funções para facilitar esse tipo de resumos, como, por exemplo, os pacotes *descr* e *reporttools*. HTH -- Cesar Rabak On Wed, Mar 23, 2016 at 1:46 PM, Daniel Tiezzi <dtiezzi@usp.br> wrote:
Boa tarde Wagner
Supondo que seus dados esteja uma tabela data_test (em anexo)
acho que você pode resolver assim
data<- read.table(“data_test.txt”, header=T, sep= “\t”)
data_df <- as.data.frame(data)
res<- list()
for (i in 1:nrow(data)) { y<- prop.test(x = c(data$X1[i], data$X2[i]), n = c(data$N[i], data$N[i]), correct = FALSE) x= y$p.value res[[paste0(i)]] <- x }
result <- t(as.data.frame(res))
data_df1 <- cbind(data_df, result)
data_df1
Espero que funcione
daniel
Daniel Tiezzi, MD, PhD Professor Associado Departamento de Ginecologia e Obstetrícia Setor de Mastologia e Oncologia Ginecológica Faculdade de Medicina de Ribeirão Preto - USP Tel.: 16 3602-2488 e-mail: dtiezzi@fmrp.usp.br
On Mar 23, 2016, at 3:50 PM, Wagner Tassinari <wtassinari@gmail.com> wrote:
AREA X1 X2 N p_valor 1 1982 9416 11398 ? 2 6546 4084 10630 ? 3 3418 667 4085 ? 4 1503 4408 5911 ? 5 966 339 305 ?
_______________________________________________ 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.

Meu centavo:
dados <- read.table(file = 'data_test.txt', header = TRUE, sep= '\t') dados <- plyr::ddply(.data = dados, .variables = .(AREA), .fun = mutate, pvalor = prop.test(x = c(X1, X2), n = c(N, N), correct = FALSE)$p.value)
att, FH 2016-03-23 14:33 GMT-06:00 Cesar Rabak <cesar.rabak@gmail.com>:
Como sugestão para um código mais enxuto, o objetivo poderia ser atingido com a aplicação da função apply:
dados <- read.table("data_test.txt", header=T, sep= "\t") dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value) dados AREA X1 X2 N p_valor 1 1 1982 9416 11398 0,000000e+00 2 2 6546 4084 10630 5,362948e-250 3 3 3418 667 40850 0,000000e+00 4 4 1503 4408 59110 0,000000e+00 5 5 966 339 30500 6,472911e-69
Ademais, se o OP tiver que resolver problemas dessa natureza com frequência, pode ser que valha a pena examinar alguns pacotes que têm funções para facilitar esse tipo de resumos, como, por exemplo, os pacotes *descr* e *reporttools*.
HTH -- Cesar Rabak
On Wed, Mar 23, 2016 at 1:46 PM, Daniel Tiezzi <dtiezzi@usp.br> wrote:
Boa tarde Wagner
Supondo que seus dados esteja uma tabela data_test (em anexo)
acho que você pode resolver assim
data<- read.table(“data_test.txt”, header=T, sep= “\t”)
data_df <- as.data.frame(data)
res<- list()
for (i in 1:nrow(data)) { y<- prop.test(x = c(data$X1[i], data$X2[i]), n = c(data$N[i], data$N[i]), correct = FALSE) x= y$p.value res[[paste0(i)]] <- x }
result <- t(as.data.frame(res))
data_df1 <- cbind(data_df, result)
data_df1
Espero que funcione
daniel
Daniel Tiezzi, MD, PhD Professor Associado Departamento de Ginecologia e Obstetrícia Setor de Mastologia e Oncologia Ginecológica Faculdade de Medicina de Ribeirão Preto - USP Tel.: 16 3602-2488 e-mail: dtiezzi@fmrp.usp.br
On Mar 23, 2016, at 3:50 PM, Wagner Tassinari <wtassinari@gmail.com> wrote:
AREA X1 X2 N p_valor 1 1982 9416 11398 ? 2 6546 4084 10630 ? 3 3418 667 4085 ? 4 1503 4408 5911 ? 5 966 339 305 ?
_______________________________________________ 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.
_______________________________________________ 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.

Por que não estou conseguindo rodar?
dados <- read.table("data_test.txt", header=T, sep= "\t")
dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value)
Error in prop.test(x = c(linha[1], linha[2]), n = c(linha[3], linha[3]), : elements of 'x' must not be greater than those of 'n'
dados
AREA X1 X2 N 1 1 1982 9416 11398 2 2 6546 4084 10630 3 3 3418 667 4085 4 4 1503 4408 5911 5 5 966 339 305
Como sugestão para um código mais enxuto, o objetivo poderia ser atingido com a aplicação da função apply:
dados <- read.table("data_test.txt", header=T, sep= "\t")
dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value)
dados
AREA X1 X2 N p_valor 1 1 1982 9416 11398 0,000000e+00 2 2 6546 4084 10630 5,362948e-250 3 3 3418 667 40850 0,000000e+00 4 4 1503 4408 59110 0,000000e+00 5 5 966 339 30500 6,472911e-69 Ademais, se o OP tiver que resolver problemas dessa natureza com frequência, pode ser que valha a pena examinar alguns pacotes que têm funções para facilitar esse tipo de resumos, como, por exemplo, os pacotes descr e reporttools. HTH -- Cesar Rabak On Wed, Mar 23, 2016 at 1:46 PM, Daniel Tiezzi <dtiezzi@usp.br> wrote: Boa tarde Wagner Supondo que seus dados esteja uma tabela data_test (em anexo) acho que você pode resolver assim data<- read.table(“data_test.txt”, header=T, sep= “\t”) data_df <- as.data.frame(data) res<- list() for (i in 1:nrow(data)) { y<- prop.test(x = c(data$X1[i], data$X2[i]), n = c(data$N[i], data$N[i]), correct = FALSE) x= y$p.value res[[paste0(i)]] <- x } result <- t(as.data.frame(res)) data_df1 <- cbind(data_df, result) data_df1 Espero que funcione daniel Daniel Tiezzi, MD, PhD Professor Associado Departamento de Ginecologia e Obstetrícia Setor de Mastologia e Oncologia Ginecológica Faculdade de Medicina de Ribeirão Preto - USP Tel.: 16 3602-2488 e-mail: dtiezzi@fmrp.usp.br On Mar 23, 2016, at 3:50 PM, Wagner Tassinari <wtassinari@gmail.com> wrote: AREA X1 X2 N p_valor 1 1982 9416 11398 ? 2 6546 4084 10630 ? 3 3418 667 4085 ? 4 1503 4408 5911 ? 5 966 339 305 ? --- Este email foi escaneado pelo Avast antivírus. https://www.avast.com/antivirus

Eu não sei do que se trata os seus dados, mas o teste que vc está aplicando diz que os valores de N são menores que o de X. Tente rodar apenas nas duas primeiras linhas. Vai funcionar. daniel Daniel Tiezzi, MD, PhD Professor Associado Departamento de Ginecologia e Obstetrícia Setor de Mastologia e Oncologia Ginecológica Faculdade de Medicina de Ribeirão Preto - USP Tel.: 16 3602-2488 e-mail: dtiezzi@fmrp.usp.br
On Mar 26, 2016, at 8:24 PM, Mauro Sznelwar <sznelwar@uol.com.br> wrote:
Por que não estou conseguindo rodar?
dados <- read.table("data_test.txt", header=T, sep= "\t") dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value) Error in prop.test(x = c(linha[1], linha[2]), n = c(linha[3], linha[3]), : elements of 'x' must not be greater than those of 'n' dados AREA X1 X2 N 1 1 1982 9416 11398 2 2 6546 4084 10630 3 3 3418 667 4085 4 4 1503 4408 5911 5 5 966 339 305
Como sugestão para um código mais enxuto, o objetivo poderia ser atingido com a aplicação da função apply:
dados <- read.table("data_test.txt", header=T, sep= "\t") dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value) dados AREA X1 X2 N p_valor 1 1 1982 9416 11398 0,000000e+00 2 2 6546 4084 10630 5,362948e-250 3 3 3418 667 40850 0,000000e+00 4 4 1503 4408 59110 0,000000e+00 5 5 966 339 30500 6,472911e-69
Ademais, se o OP tiver que resolver problemas dessa natureza com frequência, pode ser que valha a pena examinar alguns pacotes que têm funções para facilitar esse tipo de resumos, como, por exemplo, os pacotes descr e reporttools.
HTH -- Cesar Rabak
On Wed, Mar 23, 2016 at 1:46 PM, Daniel Tiezzi <dtiezzi@usp.br <mailto:dtiezzi@usp.br>> wrote: Boa tarde Wagner
Supondo que seus dados esteja uma tabela data_test (em anexo)
acho que você pode resolver assim
data<- read.table(“data_test.txt”, header=T, sep= “\t”)
data_df <- as.data.frame(data)
res<- list()
for (i in 1:nrow(data)) { y<- prop.test(x = c(data$X1[i], data$X2[i]), n = c(data$N[i], data$N[i]), correct = FALSE) x= y$p.value res[[paste0(i)]] <- x }
result <- t(as.data.frame(res))
data_df1 <- cbind(data_df, result)
data_df1
Espero que funcione
daniel
Daniel Tiezzi, MD, PhD Professor Associado Departamento de Ginecologia e Obstetrícia Setor de Mastologia e Oncologia Ginecológica Faculdade de Medicina de Ribeirão Preto - USP Tel.: 16 3602-2488 e-mail: dtiezzi@fmrp.usp.br <mailto:dtiezzi@fmrp.usp.br>
On Mar 23, 2016, at 3:50 PM, Wagner Tassinari <wtassinari@gmail.com <mailto:wtassinari@gmail.com>> wrote:
AREA X1 X2 N p_valor 1 1982 9416 11398 ? 2 6546 4084 10630 ? 3 3418 667 4085 ? 4 1503 4408 5911 ? 5 966 339 305 ?
<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> Este email foi escaneado pelo Avast antivírus. www.avast.com <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-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 <http://www.leg.ufpr.br/r-br-guia>) e forneça código mínimo reproduzível.

Continua não dando certo. Acho que é o modo como coloquei o banco de dados, coloquei assim: AREA X1 X2 N 1 1982 9416 11398 2 6546 4084 10630 3 3418 667 4085 4 1503 4408 5911 5 966 339 305 Eu não sei do que se trata os seus dados, mas o teste que vc está aplicando diz que os valores de N são menores que o de X. Tente rodar apenas nas duas primeiras linhas. Vai funcionar. daniel Daniel Tiezzi, MD, PhD Professor Associado Departamento de Ginecologia e Obstetrícia Setor de Mastologia e Oncologia Ginecológica Faculdade de Medicina de Ribeirão Preto - USP Tel.: 16 3602-2488 e-mail: dtiezzi@fmrp.usp.br On Mar 26, 2016, at 8:24 PM, Mauro Sznelwar <sznelwar@uol.com.br> wrote: Por que não estou conseguindo rodar?
dados <- read.table("data_test.txt", header=T, sep= "\t")
dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value)
Error in prop.test(x = c(linha[1], linha[2]), n = c(linha[3], linha[3]), : elements of 'x' must not be greater than those of 'n'
dados
AREA X1 X2 N 1 1 1982 9416 11398 2 2 6546 4084 10630 3 3 3418 667 4085 4 4 1503 4408 5911 5 5 966 339 305
Como sugestão para um código mais enxuto, o objetivo poderia ser atingido com a aplicação da função apply:
dados <- read.table("data_test.txt", header=T, sep= "\t")
dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value)
dados
AREA X1 X2 N p_valor 1 1 1982 9416 11398 0,000000e+00 2 2 6546 4084 10630 5,362948e-250 3 3 3418 667 40850 0,000000e+00 4 4 1503 4408 59110 0,000000e+00 5 5 966 339 30500 6,472911e-69 Ademais, se o OP tiver que resolver problemas dessa natureza com frequência, pode ser que valha a pena examinar alguns pacotes que têm funções para facilitar esse tipo de resumos, como, por exemplo, os pacotes descr e reporttools. HTH -- Cesar Rabak On Wed, Mar 23, 2016 at 1:46 PM, Daniel Tiezzi < <mailto:dtiezzi@usp.br> dtiezzi@usp.br> wrote: Boa tarde Wagner Supondo que seus dados esteja uma tabela data_test (em anexo) acho que você pode resolver assim data<- read.table(“data_test.txt”, header=T, sep= “\t”) data_df <- as.data.frame(data) res<- list() for (i in 1:nrow(data)) { y<- prop.test(x = c(data$X1[i], data$X2[i]), n = c(data$N[i], data$N[i]), correct = FALSE) x= y$p.value res[[paste0(i)]] <- x } result <- t(as.data.frame(res)) data_df1 <- cbind(data_df, result) data_df1 Espero que funcione daniel Daniel Tiezzi, MD, PhD Professor Associado Departamento de Ginecologia e Obstetrícia Setor de Mastologia e Oncologia Ginecológica Faculdade de Medicina de Ribeirão Preto - USP Tel.: 16 3602-2488 e-mail: <mailto:dtiezzi@fmrp.usp.br> dtiezzi@fmrp.usp.br On Mar 23, 2016, at 3:50 PM, Wagner Tassinari < <mailto:wtassinari@gmail.com> wtassinari@gmail.com> wrote: AREA X1 X2 N p_valor 1 1982 9416 11398 ? 2 6546 4084 10630 ? 3 3418 667 4085 ? 4 1503 4408 5911 ? 5 966 339 305 ? _____ <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> Imagem removida pelo remetente. Avast logo Este email foi escaneado pelo Avast antivírus. <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> www.avast.com _______________________________________________ R-br mailing list <mailto:R-br@listas.c3sl.ufpr.br> R-br@listas.c3sl.ufpr.br <https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-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> http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível. --- Este email foi escaneado pelo Avast antivírus. https://www.avast.com/antivirus

Bom dia Mauro O que quer dizer o X1, X2 e N? Você está aplicando um teste para comparar proporções em duas populações, certo? Ou seja, vc precisa como input duas populações com pelo menos dois valores correspondentes à respectivas proporções, certo? O X1 e X2 seriam as frequencias na população X? e o N? daniel
On Mar 28, 2016, at 4:00 AM, Mauro Sznelwar <sznelwar@uol.com.br> wrote:
1982 9416

Mauro, Sua importação de dados gerou uma quinta linha com nº de experimentos menor que os "acertos" para os testes de proporção. Veja os seus resultados versus os meus e verás que o valor de N na quinta linha deve ser 30500 e não 305 como você importou. . . HTH -- Cesar Rabak 2016-03-26 17:24 GMT-03:00 Mauro Sznelwar <sznelwar@uol.com.br>:
Por que não estou conseguindo rodar?
dados <- read.table("data_test.txt", header=T, sep= "\t")
dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value)
Error in prop.test(x = c(linha[1], linha[2]), n = c(linha[3], linha[3]), :
elements of 'x' must not be greater than those of 'n'
dados
AREA X1 X2 N
1 1 1982 9416 11398
2 2 6546 4084 10630
3 3 3418 667 4085
4 4 1503 4408 5911
5 5 966 339 305
Como sugestão para um código mais enxuto, o objetivo poderia ser atingido com a aplicação da função apply:
dados <- read.table("data_test.txt", header=T, sep= "\t")
dados$p_valor <- apply(dados[,2:4], 1, function(linha) prop.test(x=c(linha[1],linha[2]),n=c(linha[3],linha[3]), correct=F)$p.value)
dados
AREA X1 X2 N p_valor
1 1 1982 9416 11398 0,000000e+00
2 2 6546 4084 10630 5,362948e-250
3 3 3418 667 40850 0,000000e+00
4 4 1503 4408 59110 0,000000e+00
5 5 966 339 30500 6,472911e-69
Ademais, se o OP tiver que resolver problemas dessa natureza com frequência, pode ser que valha a pena examinar alguns pacotes que têm funções para facilitar esse tipo de resumos, como, por exemplo, os pacotes *descr* e *reporttools*.
HTH
--
Cesar Rabak
On Wed, Mar 23, 2016 at 1:46 PM, Daniel Tiezzi <dtiezzi@usp.br> wrote:
Boa tarde Wagner
Supondo que seus dados esteja uma tabela data_test (em anexo)
acho que você pode resolver assim
data<- read.table(“data_test.txt”, header=T, sep= “\t”)
data_df <- as.data.frame(data)
res<- list()
for (i in 1:nrow(data)) {
y<- prop.test(x = c(data$X1[i], data$X2[i]), n = c(data$N[i], data$N[i]), correct = FALSE)
x= y$p.value
res[[paste0(i)]] <- x
}
result <- t(as.data.frame(res))
data_df1 <- cbind(data_df, result)
data_df1
Espero que funcione
daniel
Daniel Tiezzi, MD, PhD
Professor Associado
Departamento de Ginecologia e Obstetrícia
Setor de Mastologia e Oncologia Ginecológica
Faculdade de Medicina de Ribeirão Preto - USP
Tel.: 16 3602-2488
e-mail: dtiezzi@fmrp.usp.br
On Mar 23, 2016, at 3:50 PM, Wagner Tassinari <wtassinari@gmail.com> wrote:
AREA X1 X2 N p_valor 1 1982 9416 11398 ? 2 6546 4084 10630 ? 3 3418 667 4085 ? 4 1503 4408 5911 ? 5 966 339 305 ?
------------------------------ [image: Avast logo] <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
Este email foi escaneado pelo Avast antivírus. www.avast.com <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
_______________________________________________ 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.
participantes (5)
-
Cesar Rabak
-
Daniel Tiezzi
-
FHRB Toledo
-
Mauro Sznelwar
-
Wagner Tassinari