Comentários
Resposta
Há uma diferença entre ajustar uma distribuição gaussiana e ajustar uma curva de densidade gaussiana. O que normalmixEM
está fazendo é o primeiro. O que você quer (eu acho) é o último.
Ajustar uma distribuição é, grosso modo, o que você faria se fizesse um histograma de seus dados e tentei ver que tipo de formato eles tinham. O que você está fazendo, em vez disso, é simplesmente traçar uma curva. Essa curva tem uma saliência no meio, como o que você obtém ao traçar uma função de densidade gaussiana.
Para obter o que deseja, você pode usar algo como optim
para ajustar a curva aos seus dados. O código a seguir usará mínimos quadrados não lineares para encontrar os três parâmetros que fornecem a curva gaussiana de melhor ajuste: m
é a média gaussiana, s
é o desvio padrão e k
é um parâmetro de escala arbitrário (uma vez que a densidade gaussiana é restrita para se integrar a 1, enquanto seus dados não são).
x <- seq_along(r) f <- function(par) { m <- par[1] sd <- par[2] k <- par[3] rhat <- k * exp(-0.5 * ((x - m)/sd)^2) sum((r - rhat)^2) } optim(c(15, 2, 1), f, method="BFGS", control=list(reltol=1e-9))
Comentários
- Brinquei com esta solução, mas você me venceu 🙂 Ao brincar, percebi que os valores iniciais iniciais dados a
optim
importavam muito , então ao usar este método, certifique-se de verificar o ajuste graficamente.
Um swer
Proponho usar mínimos quadrados não lineares para esta análise.
# First present the data in a data-frame tab <- data.frame(x=seq_along(r), r=r) #Apply function nls (res <- nls( r ~ k*exp(-1/2*(x-mu)^2/sigma^2), start=c(mu=15,sigma=5,k=1) , data = tab))
E a partir da saída, consegui obter a seguinte “curva gaussiana” ajustada:
v <- summary(res)$parameters[,"Estimate"] plot(r~x, data=tab) plot(function(x) v[3]*exp(-1/2*(x-v[1])^2/v[2]^2),col=2,add=T,xlim=range(tab$x) )
O ajuste não é incrível … A função $ x \ mapsto \ sin (x) / x $ não seria uma melhor modelo?
Comentários
- Obrigado. Recebo soma dos quadrados residuais: 0,01997. Acho que estou obtendo exatamente o mesmo com a solução de Hong Ooi acima. O algo é o mesmo? Além disso, como ploto o resultado de nls?
- Sim, os algoritmos são os mesmos no sentido de que se funcionarem (não ' não fique preso em alguns mínimo local) dão a mesma resposta. Dependendo do valor dado a
method=
, eles podem ser exatamente iguais. - Eu adicionei duas linhas para gerar o gráfico.
dput(r)
para gerar uma string que seja facilmente copiada ' n ' colável. Agora temos que inserir os dados em r manualmente …R
solução para uma variável discreta comoIndex
aparece em stats.stackexchange. com / a / 43004/919 ; uma soluçãoR
para uma variável contínua está em stats.stackexchange.com/questions/70153/… ; e uma solução Excel está em stats.stackexchange.com/a/11563/919 .