2013-09-16 3 views
0

Я прошел множество решений для этой проблемы, но не смог найти надежную автоматическую. Ниже вы найдете подробное самодостаточное описание.Как получить обратную линейную интерполяцию в R

Эти данные: 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") 

Вы увидите пик, мой вопрос теперь: если предположить, я доволен линейная интерполяция, какова ширина в половине максимума этой «кривой»? Итак, для каких значений x0 из x I f (x0) = max (y)/2, где f - линейная интерполяция. Я пробовал с approxfun и некоторой плотностью ядра, но я не хочу сглаживать свои данные.

Любой вход очень приветствуется.

+1

, имеющий два значения «4» в ваших данных x, является злым. – Bathsheba

+0

@ Bathsheba Я угадываю, что OP означает 5. – nograpes

+0

@ nograpes: Надеюсь, что он не подходит с «обратным». – Bathsheba

ответ

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 
+0

Спасибо за этот быстрый ответ! Во-первых, я просто использовал параметр type = "l", затем expressfun(). Я попробую ваше решение и дам вам знать. –

+0

Это помогает мне с моими данными, которые не являются монотонными. Большое спасибо! – TYL

Смежные вопросы