2016-06-28 123 views
0

我有一个像下面这样的列表数据。我想执行非线性回归高斯曲线中频计数计算列表中的高斯曲线拟合

mylist<- structure(list(A = structure(list(breaks = c(-10, -9, 
-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4), counts = c(1L, 
0L, 1L, 5L, 9L, 38L, 56L, 105L, 529L, 2858L, 17L, 2L, 0L, 2L), 
    density = c(0.000276014352746343, 0, 0.000276014352746343, 
    0.00138007176373171, 0.00248412917471709, 0.010488545404361, 
    0.0154568037537952, 0.028981507038366, 0.146011592602815, 
    0.788849020149048, 0.00469224399668783, 0.000552028705492686, 
    0, 0.000552028705492686), mids = c(-9.5, -8.5, -7.5, -6.5, 
    -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5), 
    xname = "x", equidist = TRUE), .Names = c("breaks", "counts", 
"density", "mids", "xname", "equidist"), class = "histogram"), 
    B = structure(list(breaks = c(-7, -6, -5, 
    -4, -3, -2, -1, 0), counts = c(2L, 0L, 6L, 2L, 2L, 1L, 3L 
    ), density = c(0.125, 0, 0.375, 0.125, 0.125, 0.0625, 0.1875 
    ), mids = c(-6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5), xname = "x", 
     equidist = TRUE), .Names = c("breaks", "counts", "density", 
    "mids", "xname", "equidist"), class = "histogram"), C = structure(list(
     breaks = c(-7, -6, -5, -4, -3, -2, -1, 0, 1), counts = c(2L, 
     2L, 4L, 5L, 14L, 22L, 110L, 3L), density = c(0., 
     0., 0.0246913580246914, 0.0308641975308642, 
     0.0864197530864197, 0.135802469135802, 0.679, 
     0.0185185185185185), mids = c(-6.5, -5.5, -4.5, -3.5, 
     -2.5, -1.5, -0.5, 0.5), xname = "x", equidist = TRUE), .Names = c("breaks", 
    "counts", "density", "mids", "xname", "equidist"), class = "histogram")), .Names = c("A", 
"B", "C")) 

我已阅读本 Fitting a density curve to a histogram in R 我的列表,并报告平均值和标准偏差的每一个元素,但是这是如何适应的嵌合曲线转换为直方图。我要的是最佳拟合值”

‘中庸’ ‘SD’

如果我使用PRISM做到这一点,我应该得到以下结果 对于A

Mids Counts 
-9.5 1 
-8.5 0 
-7.5 1 
-6.5 5 
-5.5 9 
-4.5 38 
-3.5 56 
-2.5 105 
-1.5 529 
-0.5 2858 
0.5  17 
1.5  2 
2.5  0 
3.5  2 

进行非线性回归高斯曲线拟合,我得到

"Best-fit values" 
"  Amplitude" 3537 
"  Mean"  -0.751 
"  SD"   0.3842 

第二组 乙

Mids Counts 
-6.5 2 
-5.5 0 
-4.5 6 
-3.5 2 
-2.5 2 
-1.5 1 
-0.5 3 



"Best-fit values" 
"  Amplitude" 7.672 
"  Mean"   -4.2 
"  SD"   0.4275 

和第三个

Mids Counts 
-6.5 2 
-5.5 2 
-4.5 4 
-3.5 5 
-2.5 14 
-1.5 22 
-0.5 110 
0.5  3 

我得到这个

"Best-fit values" 
"  Amplitude" 120.7 
"  Mean"  -0.6893 
"  SD"  0.4397 
+0

如果您正在寻找估计的平均值和标准差/方差,我认为这可以通过最大似然程序来完成。在R中有'mle'函数以及'maxLik'包。在这种情况下,您应该使用原始数据,而不是中间数和计数。 “mle”中的第一个例子应该与您想要的类似。 – lmo

+0

我目前无法观看视频,但在可以的情况下,我会在几个小时内查看视频。似乎从分箱数据估计失去了有用的信息。考虑到你有这么小的样本量,这尤其值得关注:16我认为。 – lmo

+0

@lmo好吧,不是真的样本大小是像1000这样高得多。所以这不会是一个问题,在这种情况下,我认为 – nik

回答

1

为了直方图转换回平均值和标准偏差的估计。首先将bin计数的结果转换为bin。这将是原始数据的近似值。

根据你上面的例子:

#extract the mid points and create list of simulated data 
simdata<-lapply(mylist, function(x){rep(x$mids, x$counts)}) 
#if the original data were integers then this may give a better estimate 
#simdata<-lapply(mylist, function(x){rep(x$breaks[-1], x$counts)}) 

#find the mean and sd of simulated data 
means<-lapply(simdata, mean) 
sds<-lapply(simdata, sd) 
#or use sapply in the above 2 lines depending on future process needs 

如果你的数据是整数,然后利用休息时间为箱将提供更好的估计。取决于直方图的函数(即right = TRUE/FALSE)可能会将结果移动一个。

编辑

我认为这将是一件容易的事情。我回顾了视频,显示的示例数据为:

mids<-seq(-7, 7) 
counts<-c(7, 1, 2, 2, 2, 5, 217, 70, 18, 0, 2, 1, 2, 0, 1) 
simdata<-rep(mids, counts) 

视频结果为mean = -0.7359和sd = 0.4571。提供我发现溶液中的最接近的结果是使用“fitdistrplus”包:

fitdist(simdata, "norm", "mge") 

使用“最大化拟合优度估计”导致平均= -0.7597280和SD = 0.8320465。
在这一点上,上述方法提供了一个接近的估计,但不完全匹配。我不知道用什么技术来计算视频的适合度。

编辑#2

将上述溶液涉案重新创建原始数据和拟合,使用任一的平均/ SD或使用fitdistrplus包。这种尝试是尝试使用高斯分布执行最小二乘拟合。

simdata<-lapply(mylist, function(x){rep(x$mids, x$counts)}) 
means<-sapply(simdata, mean) 
sds<-sapply(simdata, sd) 

#Data from video 
#mids<-seq(-7, 7) 
#counts<-c(7, 1, 2, 2, 2, 5, 217, 70, 18, 0, 2, 1, 2, 0, 1) 

#make list of the bins and distribution in each bin 
mids<-lapply(mylist, function(x){x$mids}) 
dis<-lapply(mylist, function(x) {x$counts/sum(x$counts)}) 

#function to perform the least square fit 
nnorm<-function(values, mids, dis) { 
    means<-values[1] 
    sds<-values[2] 
    #print(paste(means, sds)) 
    #calculate out the Gaussian distribution for each bin 
    modeld<-dnorm(mids, means, sds) 
    #sum of the squares 
    diff<-sum((modeld-dis)^2) 
    diff 
} 

#use optim function with the mean and sd as initial guesses 
#find the mininium with the mean and SD as fit parameters 
lapply(1:3, function(i) {optim(c(means[[i]], sds[[i]]), nnorm, mids=mids[[i]], dis=dis[[i]])}) 

该解决方案对PRISM结果提供了一个更接近的答案,但仍然不尽相同。以下是所有4种解决方案的比较。 enter image description here

从表中,最小二乘拟合(上面的那个)提供了最接近的近似值。也许调整中点dnorm函数可能会有所帮助。但情况B的数据距离正态分布最远,但PRISM软件仍然产生一个小的标准偏差,而其他方法是相似的。 PRISM软件有可能执行某种类型的数据过滤,以在合适之前移除异常值。

+0

你确定这样做,一个适用于非线性回归高斯曲线拟合? – nik

+0

嗨,我检查了上面的数据,我用PRISM建立了非线性回归高斯曲线拟合,我得到了平均值和标准差。你能看看它是否一样吗? – nik

+0

这些值不匹配。我不知道PRISM软件是如何执行这个功能的。它可能会剪裁或平滑适合的尾巴。你的情况B不是很正常,但PRISM产生的标准偏差<0.5 – Dave2e