1

その問題に対して多くの解決策を試しましたが、信頼できる自動化された解決策を見つけることができませんでした. 詳細な自給自足の説明を以下に示します。

これらはデータです: data.txt

x y
1 1
2 2
3 3
4 2
5 1

散布図としてプロットする:

t=read.table("data.txt",header=T)
plot(t$x,t$y,"l")

ピークが表示されます。私の質問は次のとおりです。線形補間に満足していると仮定すると、その「曲線」の半値幅はどれくらいですか? したがって、x のどの値 x0 に対して、f(x0)=max(y)/2 があります。ここで、f は線形補間です。私は approxfun といくつかのカーネル密度を試しましたが、データを滑らかにしたくありません。

どんな入力でも大歓迎です。

4

2 に答える 2

1

これを行うためのより良い方法はおそらくたくさんありますが、ここでは 1 つの解決策を示します。最初に補間をどのように行ったかを知っていれば、より簡単になります。

# Extend your line for testing
y<-c(1,2,3,2,1,2,3,4,5,4,3)

# Split into linear segments.
segments<-c(1,diff(diff(y)))!=0
seg.points<-which(c(segments,TRUE))

# Calculate desired value
val<-max(y)/2

# Loop through and find value
res<-c()
for(i in 1:(length(seg.points)-1)) {
  start<-y[seg.points[i]]
  end<-y[seg.points[i+1]]
  if ((val>=start & val<=end) | (val<=start & val >=end)) {
    slope=(end-start)/(seg.points[i+1] - seg.points[i])
    res<-c(res,seg.points[i] + ((val - start) / slope))
  }
}
res
# [1] 2.5 3.5 6.5
于 2013-09-16T11:55:11.700 に答える