Tenho dados do seguinte desenho experimental: minhas observações são contagens do número de sucessos ( K
) do número correspondente de tentativas ( N
), medidos para dois grupos, cada um composto por I
indivíduos, a partir de T
tratamentos, nos quais em cada combinação de fatores existem R
repetições . Portanto, no total, tenho 2 * I * T * RK 's e N ' s correspondentes .
Os dados são da biologia. Cada indivíduo é um gene para o qual mensuro o nível de expressão de duas formas alternativas (devido a um fenômeno chamado emenda alternativa). Portanto, K é o nível de expressão de uma das formas e N é a soma dos níveis de expressão das duas formas. A escolha entre as duas formas em uma única cópia expressa é assumida como sendo um experimento de Bernoulli, portanto, K fora de Ncópias segue um binômio. Cada grupo é composto por ~ 20 genes diferentes e os genes em cada grupo têm alguma função comum, que é diferente entre os dois grupos. Para cada gene em cada grupo, tenho cerca de 30 dessas medições de cada um dos três tecidos diferentes (tratamentos). Quero estimar o efeito que o grupo e o tratamento têm na variação de K / N.
Sabe-se que a expressão gênica está super-dispersa, daí o uso de binômio negativo no código abaixo.
Por exemplo, R
código de dados simulados:
library(MASS)
set.seed(1)
I = 20 # individuals in each group
G = 2 # groups
T = 3 # treatments
R = 30 # replicates of each individual, in each group, in each treatment
groups = letters[1:G]
ids = c(sapply(groups, function(g){ paste(rep(g, I), 1:I, sep=".") }))
treatments = paste(rep("t", T), 1:T, sep=".")
# create random mean number of trials for each individual and
# dispersion values to simulate trials from a negative binomial:
mean.trials = rlnorm(length(ids), meanlog=10, sdlog=1)
thetas = 10^6/mean.trials
# create the underlying success probability for each individual:
p.vec = runif(length(ids), min=0, max=1)
# create a dispersion factor for each success probability, where the
# individuals of group 2 have higher dispersion thus creating a group effect:
dispersion.vec = c(runif(length(ids)/2, min=0, max=0.1),
runif(length(ids)/2, min=0, max=0.2))
# create empty an data.frame:
data.df = data.frame(id=rep(sapply(ids, function(i){ rep(i, R) }), T),
group=rep(sapply(groups, function(g){ rep(g, I*R) }), T),
treatment=c(sapply(treatments,
function(t){ rep(t, length(ids)*R) })),
N=rep(NA, length(ids)*T*R),
K=rep(NA, length(ids)*T*R) )
# fill N's and K's - trials and successes
for(i in 1:length(ids)){
N = rnegbin(T*R, mu=mean.trials[i], theta=thetas[i])
probs = runif(T*R, min=max((1-dispersion.vec[i])*p.vec[i],0),
max=min((1+dispersion.vec)*p.vec[i],1))
K = rbinom(T*R, N, probs)
data.df$N[which(as.character(data.df$id) == ids[i])] = N
data.df$K[which(as.character(data.df$id) == ids[i])] = K
}
Estou interessado em estimar os efeitos que o grupo e o tratamento têm na dispersão (ou variação) das probabilidades de sucesso (ou seja, K/N
). Portanto, estou procurando um glm apropriado em que a resposta seja K / N, mas além de modelar o valor esperado da resposta, a variação da resposta também é modelada.
Claramente, a variação de uma probabilidade binomial de sucesso é afetada pelo número de tentativas e pela probabilidade subjacente de sucesso (quanto maior o número de tentativas e mais extrema é a probabilidade subjacente de sucesso (ou seja, próximo de 0 ou 1), menor a variação da probabilidade de sucesso), por isso estou interessado principalmente na contribuição do grupo e do tratamento além do número de tentativas e da probabilidade de sucesso subjacente. Eu acho que aplicar a transformação de raiz quadrada arcsin na resposta eliminará a última, mas não a do número de tentativas.
Embora no exemplo de dados simulados acima o design seja equilibrado (número igual de indivíduos em cada um dos dois grupos e número idêntico de réplicas em cada indivíduo de cada grupo em cada tratamento), nos meus dados reais não é - os dois grupos fazem não tem um número igual de indivíduos e o número de repetições varia. Além disso, eu imagino que o indivíduo deva ser definido como um efeito aleatório.
A plotagem da variação da amostra versus a média da amostra da probabilidade estimada de sucesso (denotada como p hat = K / N) de cada indivíduo ilustra que probabilidades extremas de sucesso têm menor variação:
Isso é eliminado quando as probabilidades de sucesso estimadas são transformadas usando a transformação estabilizadora da variância da raiz quadrada do arcsin (denotada como arcsin (sqrt (p hat)):
A plotagem da variação amostral das probabilidades estimadas de sucesso transformadas versus a média N mostra a relação negativa esperada:
A plotagem da variação amostral das probabilidades de sucesso estimadas transformadas para os dois grupos mostra que o grupo b tem variações ligeiramente maiores, e foi assim que simulei os dados:
Por fim, o gráfico da variação amostral das probabilidades de sucesso estimadas transformadas para os três tratamentos não mostra diferença entre os tratamentos, e foi assim que simulei os dados:
Existe alguma forma de um modelo linear generalizado com o qual eu possa quantificar os efeitos do grupo e do tratamento na variação das probabilidades de sucesso?
Talvez um modelo linear generalizado heterocedástico ou alguma forma de modelo de variância loglinear?
Algo nas linhas de um modelo que modela a Variância (y) = Zλ além de E (y) = Xβ, onde Z e X são os regressores da média e variância, respectivamente, que no meu caso serão idênticas e incluirão tratamento (níveis t.1, t.2 e t.3) e grupo (níveis aeb), e provavelmente N e R, e portanto λ e β estimarão seus respectivos efeitos.
Como alternativa, eu poderia ajustar um modelo às variações da amostra nas réplicas de cada gene de cada grupo em cada tratamento, usando um glm que apenas modela o valor esperado da resposta. A única questão aqui é como explicar o fato de que genes diferentes têm números diferentes de repetições. Eu acho que os pesos em um glm podem ser responsáveis por isso (as variações de amostra baseadas em mais repetições devem ter um peso maior), mas exatamente quais pesos devem ser definidos?
Nota: Tentei usar o dglm
pacote R:
library(dglm)
dglm.fit = dglm(formula = K/N ~ 1, dformula = ~ group + treatment, family = quasibinomial, weights = N, data = data.df)
summary(dglm.fit)
Call: dglm(formula = K/N ~ 1, dformula = ~group + treatment, family = quasibinomial,
data = data.df, weights = N)
Mean Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.09735366 0.01648905 -5.904138 3.873478e-09
(Dispersion Parameters for quasibinomial family estimated as below )
Scaled Null Deviance: 3600 on 3599 degrees of freedom
Scaled Residual Deviance: 3600 on 3599 degrees of freedom
Dispersion Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 9.140517930 0.04409586 207.28746254 0.0000000
group -0.071009599 0.04714045 -1.50634107 0.1319796
treatment -0.001469108 0.02886751 -0.05089138 0.9594121
(Dispersion parameter for Gamma family taken to be 2 )
Scaled Null Deviance: 3561.3 on 3599 degrees of freedom
Scaled Residual Deviance: 3559.028 on 3597 degrees of freedom
Minus Twice the Log-Likelihood: 29.44568
Number of Alternating Iterations: 5
O efeito de grupo de acordo com o dglm.fit é bastante fraco. Gostaria de saber se o modelo está correto ou se é o poder que esse modelo possui.
fonte
Respostas:
Talvez o que você esteja procurando seja algo chamado modelos lineares generalizados duplos, em que os parâmetros de média e dispersão sejam modelados. Há até um pacote dglm R projetado para atender a esses modelos.
fonte