TIL | Model Fitting Beginner
虽然第一年的project就做过model fitting,但是从头到尾都有学长指导,用的也是现成的psychometrics function和代码。而这次,是要自己确定用什么model,以及model什么样,各个参数对应的实验行为的意义是什么。
语言:Python
环境:jupyter notebook
OS:macOS Mojave 10.14.4 Beta 4
上周末要为practice talk分析一下现有的数据,其中一个实验的设计是想看不同类别的stimuli consolidate到working memory的速率,而两个变量之间的关系并不是线性的,有一个曲线攀升的过程。我需要得到攀升的速率和进入平台期后的表现,显然任何我熟悉的linear model都不可能用在这里,而我经过过去一年开始熟知各种曲线function(如Weibull function)也不适用。
新手如我,虽然没有经验,但也大抵知道应该找找exponential和logarithmic model,万能的google帮我找到了logarithmic model现成的代码(感恩stackflow),而且人家的图大致就是我想要的效果,如图:

于是我依葫芦画瓢,开始fit我自己的数据,结果却长这样:

这个时候我虽然意识到了可能这个logarithmic model并不适用于我的数据,但是我又想不明白为什么别人的fit那么好,感觉跟我数据形状差别没有很大啊。为什么我却是fit成这个鬼样子呢W(`0`)W
于是我尝试了把横轴的单位从毫秒转换成秒,于是有了这样的:

既然fit不了我也就不强fit了,但也依然没有决定要换别的model,主要是仍然没有理解到自己的数据到底应该用什么model,也不能理解为什么这个model不适合我的数据。愁了一个下午的我,最后决定求助于学长。他一看我的图就说你这个model肯定不对,到此我才有信心决定弃掉这个model_(:_」∠)_
但具体用什么model仍然是个问题。我开始思考我的数据形状,应该是攀升逐渐放缓到平台的状态。经过对数据特征和各种growth model特征的了解,我最后认为应该用exponential decay model:
y = 1-b*(e^(-a*t))
于是有了这样的fitting,好了很多,但依然与实际数据不太符合:

正当我在怀疑是不是这个model也不合适时,学长又点醒了我:你可以在基础的function上加入自己的参数的。于是我又将function改成了:
y = c(1-b*(e^(-a*t)))

到这一步,我的重点就在于如何将这些参数和行为实验的结果相对应。譬如到底哪个参数表示consolidation rate,其他参数又表示什么。
最后确定了a可以对应consolidation rate,c是performance的upper bound,(c-cb)则是performance的lower bound。但在检视数据的过程中,我发现c并不能准确地反应真实数据的upper bound,而是低于真实值较多。于是我想着或许再加一个参数会更好?
y = c(1-b*(e^(-a*t))) + d
这时,fit出来的结果(c+d)就能比较准确地反应upper bound了,其他对应的参数(组合)也与实际数据吻合。
至此,我得到了能比较准确描述数据的model,并且各项参数及其组合也能够很好地与行为结果对应起来。更重要的是,我开始对model fitting和如何trouble shooting的过程有了一点了解,为自己学到了一点东西倍感欣慰(⁎⁍̴̛ᴗ⁍̴̛⁎)
你又在摸鱼了的最新日记 · · · · · · ( 全部 )
- Dexa Scan初体验 (2人喜欢)
- CKD猫护理笔记 (5人喜欢)
热门话题 · · · · · · ( 去话题广场 )
-
加载中...