Масштабировать данные, чтобы соответствовать в определенном c пике? - PullRequest
0 голосов
/ 25 марта 2020

Это может быть больше математический вопрос, чем вопрос R.

Есть ли способ изменить масштаб данных, чтобы они соответствовали определенной точке c?

Вот пример:

peak_a<-c(0.1,0.4,0.6,0.8,0.9,1,0.9,0.8,0.6,0.4,0.1,0.05,0.04)
peak_b<-c(0.04,0.06,0.1,0.2,0.3,0.45,0.7,0.9,1.1,1.3,1.35,1.3,1.15,1,0.85,0.65,0.5)
abs<-c(peak_a,1.5*peak_b)
abs2<-c(1.5*peak_a,0.5*0.9*peak_b)
abs3<-c(0.9*peak_a,peak_b)
plot(abs, type="l")
lines(abs2,col="red")
lines(abs3,col="blue")

Graph of three curves with two peaks each Я хочу, чтобы все три кривые имели одинаковую высоту на пике A, сохраняя при этом соотношение между пиками A и B. В моих реальных данных у меня есть ок. 100 спектров с пятью пиками. Пики всегда находятся в одном и том же диапазоне значений по оси X, и я хочу изменить их масштаб для каждого пика, сохраняя при этом правильную крысу ios между всеми этими пиками.

1 Ответ

2 голосов
/ 25 марта 2020

Вы можете масштабировать каждую строку на отношение в точке таких линий:

peak_a<-c(0.1,0.4,0.6,0.8,0.9,1,0.9,0.8,0.6,0.4,0.1,0.05,0.04)
peak_b<-c(0.04,0.06,0.1,0.2,0.3,0.45,0.7,0.9,1.1,1.3,1.35,1.3,1.15,1,0.85,0.65,0.5)
abs<-c(peak_a,1.5*peak_b)
abs2<-c(1.5*peak_a,0.5*0.9*peak_b)
abs3<-c(0.9*peak_a,peak_b)
plot(abs, type="l")
lines(abs2*abs[6]/abs2[6],col="red")
lines(abs3*abs[6]/abs3[6],col="blue")

enter image description here

некоторые фактические данные из пара ваших кривых может помочь сделать более надежное решение, более соответствующее вашим потребностям.


Вот способ «автоматизации» процедуры, поскольку вы сказали, что у вас много кривых:

peak_a<-c(0.1,0.4,0.6,0.8,0.9,1,0.9,0.8,0.6,0.4,0.1,0.05,0.04)
peak_b<-c(0.04,0.06,0.1,0.2,0.3,0.45,0.7,0.9,1.1,1.3,1.35,1.3,1.15,1,0.85,0.65,0.5)
abs<-c(peak_a,1.5*peak_b)
abs2<-c(1.5*peak_a,0.5*0.9*peak_b)
abs3<-c(0.9*peak_a,peak_b)
abs4<-c(0.75*peak_a,peak_b)
abs5<-c(0.88*peak_a,peak_b)

plot(abs, type="l")

ListOfCurves <- sapply(2:5, function(x) paste0("abs",x))
AllCurves <- lapply(ListOfCurves, function(x) eval(parse(text=x)))
NormalizedCurves <- lapply(AllCurves, function (x) x*abs[6]/x[6])

lapply(1:4, function(x) lines(NormalizedCurves[[x]],col=x))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...