Pico Tech - Peak Fit With R

Radiation Detection / Software Projects ... Peak Fit With Octave ... Peak Fit With Python ... Peak Fit With Gnuplot / 日本語ページインデックス ... English Documents / 掲示板

Octave に有望なコード群を見つけたので、そっちを優先してやることにしました。 Peak Fit With Octave 目標は同じか、それ以上。Python系の情報も一応収集中 Peak Fit With Python また、Gnuplotでさえ、結構できる みたいです。


目標 (Rど素人で、統計も数学も、もう知らんのでヨチヨチ歩きから始める)

ベクモニ、テレミノ、SPE形式のスペクトルを与えると、

もしも上の目標が出来たら

 やりたいことと、その理由については、新たにまとめページを作りました。  Theremino Mca To Do Ja


やったこと

data = read.csv("http://www.mikage.to/radiation/spviewer/data_fnf401/fnf401_milk.csv" , skip=22, nrow=1022, header=FALSE)

names(data) = c("ch","sp")

plot(data$ch, data$sp, type="l", log="y", xlab="Channel", ylab="Count", col="#f39800")

 # sl=lowess(data$sp, f=0.03, delta=0.5)

require(graphics)

sl=Smooth.spline(data$sp)

lines(sl, col = 3)

library(Defaults)

library(quantmod)

p=findPeaks(sl$y, 0.08)

points(sl$x[p], sl$y[p], col=2)

fn = "../hogehoge.spe" # 後で、ファイル名で判断して(あるいはファイルを読んでから?)複数形式を読み込む関数か何かにするでの、ファイル名は変数にしておく。

ds = scan(fn, what="") # ファイルを、全部文字としてひとまず読み込む。

i = match("$DATA:",ds)+2 # データの始まりを探す

n = as.integer(ds[i])+1  # データの終わりのインデックスを読む

ne = n + i # いまいち計算が「添え字?」で使えるのか良く分からんので念のため先に計算しておく。

i = i+1 # インクリメントって i++ とかできんのかな?

dsp = as.integer(ds[i:ne]) # データ部分だけ切り出して、整数列に変換。 yがこれ

dch = 1:n # xがこれ。

data = data.frame(dch, dsp) # この後は、最初のcsvファイルを読んだ後と同じ。  names(data) = c("ch","sp")

   と思ったが、数年前に書かれて、パッケージは今年の2月に出来た、が、バイナリーがきちんとコンパイルされてないのか、動かない。

http://www.dw-sapporo.co.jp/technology/658766f830d530a130a430eb7f6e304d5834/root_usersguide_jp/5FittingHistgram.pdf

  http://hp.vector.co.jp/authors/VA052342/index.htm
  http://ja.wikipedia.org/wiki/%E6%9B%B2%E7%B7%9A%E3%81%82%E3%81%A6%E3%81%AF%E3%82%81


ここは、なかなか充実している。これにコンプトン散乱のパターンを加え、検出器の特性などなどを加味すれば、面白そう。まだ全然分かっていないが、とても素晴らしいのではないか、という気がする。

http://terpconnect.umd.edu/~toh/spectrum/Integration.html

http://terpconnect.umd.edu/~toh/spectrum/TOC.html

http://terpconnect.umd.edu/~toh/spectrum/PeakFindingandMeasurement.htm

http://terpconnect.umd.edu/~toh/spectrum/PeakFindingandMeasurement.htm#ipeak

Mingw版のOctave

http://sourceforge.net/projects/octave/files/Octave%20Windows%20binaries/Octave%203.6.1%20for%20Windows%20MinGW%20installer/

Octave は、新しいページでやってみよう。 Peak Fit With Octave


これを読んで笑っているあなた、さらさらとRのコードを書いて、メールで私まで送ってください。

nkom あっと pico.dreamhosters.com

2015年現在、やっぱり色々と目移りした後で、Gnuplotで、徐々にやっています。

Peak Fit With Gnuplot これって、色々マシンで動きますし、単純なことしか出来ない様に見えて、

なかなか侮れません。まあ、RやOctave,Pythonなどなどには遠く及びませんが、そういうシステムを

マシンに入れなくても、「Gnuplotだけ」でおおよそ出来てしまいます。


 library(nlme)
 fit = gnls(sp ~ c + d*(ch-350) + b*(ch-350)^2

+ e1*dnorm((ch-m1)/s1)

+ e2*dnorm((ch-m2)/s2)

+ e3*dnorm((ch-m3)/s3),

data=data, subset=250:450,

start=list(c=10,d=-0.05,b=0.001,e1=10,e2=10,e3=10,

m1=300,m2=325,m3=395,s1=7,s2=7,s3=7),

weights=varPower(fixed=0.5),

control=list(nlsTol=1e-4)) # 収束しないときは1e-3に直す

 points(data$ch[250:450], fitted(fit), type="l")
 a = coef(fit)
 points(data$ch, a['c']+a['d']*(data$ch-350)+a['b']*(data$ch-350)^2, type="l")


奥村さんのサイトよりコピーしてきた使えるかもしれないコード。
http://oku.edu.mie-u.ac.jp/~okumura/stat/peakfit.php

こういうのみんな変数化して、代入する値を変えればコピペで使えるようになっていると

学校時代は数十年前に終わった人間には、楽なんですが。

これらの例だけで大変助かっておりますし、何一つ文句を言えた筋合いでは無いことは
承知しておりますが、何分急激に勉強する事が非常に多いので、専門家の方が
モジュール化、関数化しておいていただけると、実装屋としては、ぽこぽこはめ込んで、
組み合わせて、すり合わせて、ごり押しして、なんとかバラバラにならずに動くものを
作りやすいのです。
例題を見て、応用問題を解いて、自分でモジュール化して、というのは、若い人の勉強には
大変素晴らしいことだと思いますが、何分昨今のコピペ文明と歳のせいで、脳みそも
腐っておりますので、ちょっと、と言うかかなり大変です。


library(nlme)
data = read.csv("test95.csv", skip=22, nrow=2040, header=FALSE)
names(data) = c("ch","sp")
plot(data$ch, data$sp, type="l", xlab="Channel", ylab="Count", col="#f39800")
plot(data$ch, data$sp, type="l", xlim=c(1200,1600), ylim=c(0,100), xlab="Channel", ylab="Count", col="#f39800")
fit = gnls(sp ~ c + d*(ch-1200) + b*(ch-1600)^2 + e1*dnorm((ch-m1)/s1), data=data, subset=1200:1600, start=list(c=10,d=-0.05,b=0.001,e1=10, m1=1460,s1=7), weights=varPower(fixed=0.5), control=list(nlsTol=1e-4)) # 収束しないときは1e-3に直す
points(data$ch[1200:1600], fitted(fit), type="l")
a = coef(fit)
points(data$ch, a['c']+a['d']*(data$ch-1600)+a['b']*(data$ch-1600)^2, type="l")
sum(a['e1']*dnorm((data$ch-a['m1'])/a['s1']))
v = vcov(fit)
sqrt(v['e1','e1']/a['e1']^2 + v['s1','s1']/a['s1']^2 + 2*v['e1','s1']/(a['e1']*a['s1']))
sum((sp[1200:1600]-fitted(fit))^2/fitted(fit))


library(nlme) data = data.frame(sp=sp, ch=ch) fit2 = gnls(sp ~ c + d*ch + e*dnorm((ch-m)/s), data=data, start=list(c=50,d=-0.2,e=100,m=50,s=5), weights=varPower(fixed=0.5), control=list(nlsTol=1e-4))
a = coef(fit2) # 係数 a
sum(a['e']*dnorm((ch-a['m'])/a['s'])) v = vcov(fit2) # 共分散行列 sqrt(v['e','e']/a['e']^2 + v['s','s']/a['s']^2 + 2*v['e','s']/(a['e']*a['s']))


fit = glm(sp ~ ch + dnorm((ch-50)/5), data=data, family=poisson(link="identity"))
summary(fit)
summary(fit)$coefficients[3,1:2]*sum(dnorm((ch-50)/5))

fit = glm(sp ~ ch + dnorm((ch-5000)/500), data=data, family=poisson(link="identity"))
fit = gnls(sp ~ c + d*ch + e*dnorm((ch-5000)/500), data=data, start=list(c=0.5,d=0,e=1), weights=varPower(fixed=0.5))


参考資料置き場

http://oku.edu.mie-u.ac.jp/~okumura/stat/121005.html

https://gist.github.com/koh-t/871963
https://gist.github.com/mickey24/869400


Last modified : Sun Oct 4 11:00:30 2015 Maintained by nkom AT pico.dreamhosters.com