Esta pergunta já tem respostas aqui :

Comentários

  • r claramente não é normal. Sua distribuição é distorcida à direita (muitos valores pequenos próximos de 0, poucos valores grandes). Você verá isso digitando " hist (r) ".
  • Dica! Use dput(r) para gerar uma string que seja facilmente copiada ' n ' colável. Agora temos que inserir os dados em r manualmente …
  • @RasmusB å å th obrigado, eu estava procurando por esse comando 🙂 Eu editei a pergunta.
  • Você não ' t plotar uma sequência de valores de dados para ver o distribuição. $ R $ representa uma frequência ou densidade de probabilidade de valores de dados?
  • Já respondi a essa pergunta várias vezes em diversos contextos. Uma R solução para uma variável discreta como Index aparece em stats.stackexchange. com / a / 43004/919 ; uma solução R 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 .

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) ) 

insira a descrição da imagem aqui

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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *