将rJAGS删失线性回归模型转换为PyMC3

时间:2017-07-14 17:59:05

标签: python r pymc3 jags rjags

我目前正在尝试将我的老板最初在R / rJAGS中编写的程序翻译成Python / PyMC3,部分原因是因为他想看看它是否是python可以做的,部分是因为我想学习怎么做这种事情,知道这似乎是件好事。我已经在PyMC3中使用了线性拟合模型,但是我在尝试复制删失位时遇到了困难。

R程序在表中读取,每行具有三个特定x值的y值,这三个值在数据集中是恒定的。每个y值也有一些与之相关的错误。如果是这样的话我就有了一个可以做到这一点的PyMC3模型;这是我为之设置的玩具模型:

import numpy as np
import pymc3 as pmc

# set random seed for reproducibility
np.random.seed(12345)

x = np.linspace(0,10,3)

# Make some model data
# Parameters for linear fit
slope_true = -0.2
inter_true = 0.1

#Linear function
linear = lambda x,slope,inter: slope*x+inter
f_true = linear(x=x,slope=slope_true, inter=inter_true )

# add noise to the data points
f = f_true + np.random.normal(size=len(x)) * 0.05 
f_error = np.ones_like(f_true)*f.max()*np.random.uniform(0,1,size=len(x))

with pmc.Model() as model3:
    slope = pmc.Normal('slope', mu=0, tau=0.4, testval= 0.15)
    inter = pmc.Normal('inter', mu=0, tau=40, testval=0.15)

    linear = pmc.Deterministic('linear', slope*x+inter)

    y = pmc.Normal('y', mu=linear, tau=1.0/f_error**2, observed=f)

    start = pmc.find_MAP()
    step = pmc.NUTS()
    trace = pmc.sample(1000,start=start)

# extract results
slope_fit = np.median(trace.slope)
slope_up = slope_fit - np.percentile(trace.slope, 15.9)
slope_dn = np.percentile(trace.slope, 84.1) - slope_fit

上面的模型在网上找到的示例中有点被黑客攻击,它在一条线上生成点,添加了一点噪音和一些错误"然后在有噪声的点上执行拟合。之后,它抓取斜率的中值和与之相关的一些误差。

但现在我需要能够解释有时弹出的这些删失点。在这种情况下,某些y值可能是非检测值,因此该点的值被视为检查限制,然后将该点设置为NaN,并且该点仍然与该点相关联。处理此问题的R代码模型(保存为lin_regress_model.bug)如下所示:

model {
    for (i in 1:N) {
        isCensored[i] ~ dinterval(rv[i], censorLimitVec[i])
        rv[i] ~ dnorm(y[i],rve[i])
        y[i] <- a*x[i] + b
    }
    a ~ dnorm(0, 1e-6)
    b ~ dnorm(0, 1e-6)
    tau ~ dgamma(0.001, 0.001)
    sigma <- 1/sqrt(tau)
}

以下是可能获得的数据示例:

N = 3 # always 3, because 3 points
isCensored = c(False, False, True)
censorLimitVec = c(-6.65, -6.65, -6.65) # was value of 3rd point before NA
rv = c(-3.4, -4.7, NA) # y-values
rve = c(7e3, 7e2, 6.66) # these are Tau I think, like 1/sigma^2
x = c(0.15, 0.68, 0.94) # x-values

因此所有这些都被传递到jags模型中,并且它能够适应这个被删除的数据,但我不能为我的生活找出如何将该位转换为PyMC3-speak 。听起来像这里的dinterval函数可能类似于PyMC3中的Uniform,但我真的不知道如何处理它,因为我不能直接翻译公式线(波形符号本身的概念) R对我来说仍然有点奇怪。)

如果有人可以帮助我,我将不胜感激。据我所知,PyMC3可能甚至不可能,或者它很容易,我只是错过了一些东西。无论如何,我已经把头撞到墙上几天了,所以我觉得最好只是在这一点上寻求帮助。

0 个答案:

没有答案