পইসন মডেলগুলির ক্ষেত্রে আমি এও বলব যে অ্যাপ্লিকেশনটি প্রায়শই নির্দেশ দেয় যে আপনার সোভিয়েটগুলি যোগমূলকভাবে কাজ করবে (যা তারপরে একটি পরিচয় লিঙ্ক বোঝায়) বা লিনিয়ার স্কেল (যা তারপরে একটি লগ লিঙ্ককে বোঝায়) তে বহুগুণে কাজ করবে। তবে একটি পরিচয় লিঙ্কযুক্ত পায়সন মডেলগুলি কেবলমাত্র সাধারণভাবে বোধগম্য হয় এবং কেবল কোনও যদি লাগানো সহগের উপর ননএগিয়েটিভিটির সীমাবদ্ধতা চাপায় তবে কেবল স্টেইলে ফিট হতে পারে - nnpois
এটি আর addreg
প্যাকেজে nnlm
ফাংশনটি ব্যবহার করে বা ফাংশনটি ব্যবহার করে করা যেতে পারেNNLM
প্যাকেজ। সুতরাং আমি একমত নই যে কোনও একটি পোইসন মডেলকে একটি পরিচয় এবং লগ লিঙ্ক উভয়ের সাথেই ফিট করা উচিত এবং দেখতে হবে কোনটি সেরা এআইসি থাকা এবং খাঁটি পরিসংখ্যানের ভিত্তিতে সেরা মডেলটি নির্ধারণ করা - বরং বেশিরভাগ ক্ষেত্রেই এটি নির্ধারিত হয় যে সমস্যার সমাধান করার চেষ্টা করে বা ডেটা হাতে থাকে তার অন্তর্নিহিত কাঠামো।
উদাহরণস্বরূপ, ক্রোমাটোগ্রাফিতে (জিসি / এমএস বিশ্লেষণ) প্রায়শই প্রায় বেশ কয়েকটি প্রায় গাউসীয় আকারের শৃঙ্গগুলির সুপারিম্পোজড সংকেত পরিমাপ করা হত এবং এই সুপারিম্পোজড সিগন্যালটি একটি ইলেক্ট্রন গুণক দ্বারা পরিমাপ করা হয়, যার অর্থ পরিমাপ করা সংকেত আয়ন গণনা এবং তাই পোয়েসন বিতরণ করা হয়। যেহেতু প্রতিটি শিখর সংজ্ঞা অনুসারে একটি ইতিবাচক উচ্চতা এবং সংযোজনমূলক পদক্ষেপ নিয়ে থাকে এবং শব্দটি পোইসন, তাই পরিচয়ের লিঙ্কযুক্ত একটি নন-নেগেটিভ পোইসন মডেল এখানে উপযুক্ত হবে এবং লগ লিঙ্ক পোইসন মডেলটি সরল ভুল হবে। ইঞ্জিনিয়ারিংয়ে কুলব্যাক-লেবেলারের ক্ষতি প্রায়শই এই জাতীয় মডেলগুলির জন্য ক্ষতির ফাংশন হিসাবে ব্যবহৃত হয় এবং এই ক্ষয়টি হ্রাস করা একটি নন-অ্যাগিভেটিভ আইডেন্টি-লিংক পোইসন মডেলের সম্ভাবনাটিকে অনুকূল করার সমতুল্য ( আলফা বা বিটা ডাইভারজেন্সের মতো অন্যান্য বিচ্যুতি / ক্ষতির ব্যবস্থাও রয়েছে) একটি বিশেষ ক্ষেত্রে হিসাবে পইসন আছে)।
নীচে একটি সংখ্যাসূচক উদাহরণ রয়েছে যা একটি নিয়মিত অনিয়ন্ত্রিত পরিচয় লিঙ্ক পোইসন জিএলএম ফিট করে না (এই কারণে ননএগিটিভিটি সীমাবদ্ধতার অভাবে) এবং কীভাবে নন-নেগেটিভ পরিচয়-লিংক পোইসন মডেলগুলি ফিট করতে পারে সে সম্পর্কে কিছু বিশদ বিবরণ সহnnpois
, এখানে ব্যান্ডযুক্ত কোভারিয়েট ম্যাট্রিক্স ব্যবহার করে ক্রোমাটোগ্রাফিক শিখরগুলির একটি ক্রাইম্যাটোগ্রাফিক শিখরগুলির একটি পরিমাপিত মহাকাশটিকে ডিকনভোলিউটিং করার প্রসঙ্গে যেখানে একক শিখরের পরিমাপক আকারের স্থানান্তরিত অনুলিপিগুলি রয়েছে। ননএগিটিভিটি এখানে বেশ কয়েকটি কারণে গুরুত্বপূর্ণ: (1) এটি কেবলমাত্র ডেটার জন্য বাস্তবসম্মত মডেল (এখানে শিখর নেতিবাচক উচ্চতা থাকতে পারে না), (২) পরিচয়ের লিঙ্কের সাথে পোয়েসন মডেলকে স্থিরভাবে ফিট করার একমাত্র উপায় এটি (যেমন) অন্যথায় পূর্বাভাসগুলি কিছু সংঘবদ্ধ মানগুলি নেতিবাচক হতে পারে, যা কোনও অর্থবোধ করে না এবং যখন সম্ভাবনাটি মূল্যায়নের চেষ্টা করবে তখন সংখ্যাসূচক সমস্যা দেখা দেয়), (3) ননএগিটিভিটি রিগ্রেশন সমস্যাটি নিয়মিত করতে কাজ করে এবং স্থিতিশীল অনুমানগুলি (যেমন উদাহরণস্বরূপ) প্রাপ্তিতে ব্যাপকভাবে সহায়তা করে আপনি সাধারণ অনিয়ন্ত্রিত রিগ্রেশন হিসাবে সাধারণত অত্যধিক সমস্যাগুলি পান না,অ-নেগেইটিভিটি বাধা বিপ্লব অনুমানের ফলস্বরূপ যা প্রায়শই স্থল সত্যের কাছাকাছি থাকে; নীচের ডিকনভোলিউশন সমস্যার জন্য উদাহরণস্বরূপ পারফরম্যান্স লাসো নিয়মিতকরণের মতোই দুর্দান্ত, তবে কোনও নিয়মিতকরণ পরামিতি টিউন করার প্রয়োজন নেই। ( L0-pseudonorm দণ্ডিত রিগ্রেশন এখনও কিছুটা ভাল পারফরম্যান্স করে তবে আরও বেশি গণনা ব্যয় করে )
# we first simulate some data
require(Matrix)
n = 200
x = 1:n
npeaks = 20
set.seed(123)
u = sample(x, npeaks, replace=FALSE) # unkown peak locations
peakhrange = c(10,1E3) # peak height range
h = 10^runif(npeaks, min=log10(min(peakhrange)), max=log10(max(peakhrange))) # unknown peak heights
a = rep(0, n) # locations of spikes of simulated spike train, which are assumed to be unknown here, and which needs to be estimated from the measured total signal
a[u] = h
gauspeak = function(x, u, w, h=1) h*exp(((x-u)^2)/(-2*(w^2))) # peak shape function
bM = do.call(cbind, lapply(1:n, function (u) gauspeak(x, u=u, w=5, h=1) )) # banded matrix with peak shape measured beforehand
y_nonoise = as.vector(bM %*% a) # noiseless simulated signal = linear convolution of spike train with peak shape function
y = rpois(n, y_nonoise) # simulated signal with random poisson noise on it - this is the actual signal as it is recorded
par(mfrow=c(1,1))
plot(y, type="l", ylab="Signal", xlab="x", main="Simulated spike train (red) to be estimated given known blur kernel & with Poisson noise")
lines(a, type="h", col="red")
# let's now deconvolute the measured signal y with the banded covariate matrix containing shifted copied of the known blur kernel/peak shape bM
# first observe that regular OLS regression without nonnegativity constraints would return very bad nonsensical estimates
weights <- 1/(y+1) # let's use 1/variance = 1/(y+eps) observation weights to take into heteroscedasticity caused by Poisson noise
a_ols <- lm.fit(x=bM*sqrt(weights), y=y*sqrt(weights))$coefficients # weighted OLS
plot(x, y, type="l", main="Ground truth (red), unconstrained OLS estimate (blue)", ylab="Peak shape", xlab="x", ylim=c(-max(y),max(y)))
lines(x,-y)
lines(a, type="h", col="red", lwd=2)
lines(-a_ols, type="h", col="blue", lwd=2)
# now we use weighted nonnegative least squares with 1/variance obs weights as an approximation of nonnegative Poisson regression
# this gives very good estimates & is very fast
library(nnls)
library(microbenchmark)
microbenchmark(a_wnnls <- nnls(A=bM*sqrt(weights),b=y*sqrt(weights))$x) # 7 ms
plot(x, y, type="l", main="Ground truth (red), weighted nnls estimate (blue)", ylab="Signal (black) & peaks (red & blue)", xlab="Time", ylim=c(-max(y),max(y)))
lines(x,-y)
lines(a, type="h", col="red", lwd=2)
lines(-a_wnnls, type="h", col="blue", lwd=2)
# note that this weighted least square estimate in almost identical to the nonnegative Poisson estimate below and that it fits way faster!!!
# an unconstrained identity-link Poisson GLM will not fit:
glmfit = glm.fit(x=as.matrix(bM), y=y, family=poisson(link=identity), intercept=FALSE)
# returns Error: no valid set of coefficients has been found: please supply starting values
# so let's try a nonnegativity constrained identity-link Poisson GLM, fit using bbmle (using port algo, ie Quasi Newton BFGS):
library(bbmle)
XM=as.matrix(bM)
colnames(XM)=paste0("v",as.character(1:n))
yv=as.vector(y)
LL_poisidlink <- function(beta, X=XM, y=yv){ # neg log-likelihood function
-sum(stats::dpois(y, lambda = X %*% beta, log = TRUE)) # PS regular log-link Poisson would have exp(X %*% beta)
}
parnames(LL_poisidlink) <- colnames(XM)
system.time(fit <- mle2(
minuslogl = LL_poisidlink ,
start = setNames(a_wnnls+1E-10, colnames(XM)), # we initialise with weighted nnls estimates, with approx 1/variance obs weights
lower = rep(0,n),
vecpar = TRUE,
optimizer = "nlminb"
)) # very slow though - takes 145s
summary(fit)
a_nnpoisbbmle = coef(fit)
plot(x, y, type="l", main="Ground truth (red), nonnegative Poisson bbmle ML estimate (blue)", ylab="Signal (black) & peaks (red & blue)", xlab="Time", ylim=c(-max(y),max(y)))
lines(x,-y)
lines(a, type="h", col="red", lwd=2)
lines(-a_nnpoisbbmle, type="h", col="blue", lwd=2)
# much faster is to fit nonnegative Poisson regression using nnpois using an accelerated EM algorithm:
library(addreg)
microbenchmark(a_nnpois <- nnpois(y=y,
x=as.matrix(bM),
standard=rep(1,n),
offset=0,
start=a_wnnls+1.1E-4, # we start from weighted nnls estimates
control = addreg.control(bound.tol = 1e-04, epsilon = 1e-5),
accelerate="squarem")$coefficients) # 100 ms
plot(x, y, type="l", main="Ground truth (red), nonnegative Poisson nnpois estimate (blue)", ylab="Signal (black) & peaks (red & blue)", xlab="Time", ylim=c(-max(y),max(y)))
lines(x,-y)
lines(a, type="h", col="red", lwd=2)
lines(-a_nnpois, type="h", col="blue", lwd=2)
# or to fit nonnegative Poisson regression using nnlm with Kullback-Leibler loss using a coordinate descent algorithm:
library(NNLM)
system.time(a_nnpoisnnlm <- nnlm(x=as.matrix(rbind(bM)),
y=as.matrix(y, ncol=1),
loss="mkl", method="scd",
init=as.matrix(a_wnnls, ncol=1),
check.x=FALSE, rel.tol=1E-4)$coefficients) # 3s
plot(x, y, type="l", main="Ground truth (red), nonnegative Poisson nnlm estimate (blue)", ylab="Signal (black) & peaks (red & blue)", xlab="Time", ylim=c(-max(y),max(y)))
lines(x,-y)
lines(a, type="h", col="red", lwd=2)
lines(-a_nnpoisnnlm, type="h", col="blue", lwd=2)