R перекалибровать кривые от нуля до нуля

У меня есть около 80 кривых с этой общей формой, полученной из сглаживания гаммы с использованием пакета mgcv (это dput для двух кривых):

curve1 = structure(c(7.49350131435014, 9.20913921518434, 10.897558273626, 12.5315396472817, 14.0838644937566, 15.5273139706588, 16.8354309019618, 17.9992764380826, 19.0274300558767, 19.9292328985738, 20.714026109397, 21.3911508315718, 21.9755738920627, 22.5047648527841, 23.0218189593889, 23.5698314575296, 24.1918975928601, 24.9307185773568, 25.8199328484249, 26.8841160688986, 28.1474498679369, 29.6341158746979, 31.3682957183393, 33.3653189702521, 35.6051069707551, 38.0587290024005, 40.6972543477403, 43.4917522893258, 46.412585160685, 49.4138554677925, 52.4334058890734, 55.4083721539251, 58.2758899917481, 60.973095131941, 63.4387734705847, 65.6183115704873, 67.4587461611377, 68.9071139720254, 69.9104517326394, 70.4166212524078, 70.3924611793416, 69.8237870000362, 68.6972392810251, 66.9994585888416, 64.7170854900195, 61.8447094036925, 58.4087151593964, 54.4434364392668, 49.9832069254401, 45.0623603000519, 39.7160061164762, 33.9970989665565, 27.9764384806052, 21.7256001601735, 15.3161595068118, 8.81969202207108, 2.30818949037147, -4.14469117238674, -10.4648767674334, -16.5782940959985, -22.4108699593122, -27.8894639845452, -32.9623907955166, -37.5994200126921, -41.7712540824789, -45.4485954512844, -48.6021465655158, -51.2130051654573, -53.3038501669034, -54.9077557795256, -56.057796212995, -56.7870456769835, -57.1291276417828, -57.130298571955, -56.8494479263324, -56.3460144243683, -55.6794367855146, -54.9091537292243, -54.0902712864655, -53.2605647342642, -52.4534766611619, -51.702449655701, -51.0409263064234, -50.5015466282473, -50.0984914427865, -49.8274823783449, -49.6834384896055, -49.6612788312509, -49.7559224579641, -49.9605546528188, -50.2614256124518, -50.6430517618898, -51.0899495261606, -51.5866353302916, -52.1178475575856, -52.6734296317039, -53.2483300166574, -53.8377191347404, -54.4367674082406, -55.0406452594513), .Dim = c(100L, 1L), .Dimnames = list(NULL, "pd_2"))
curve2 = structure(c(-4.50299508184076, -3.70453890848835,-2.91058337080674, -2.12562910446626, -1.35417674513703, -0.600726928489934, 0.130318651354656, 0.836833955940232, 1.51896860247409, 2.1769711497127, 2.81109015641316, 3.42157418133328, 4.00979189203588, 4.58159239130783, 5.1439448907422, 5.70381860193193, 6.26818273646995, 6.84402482790598, 7.4387538147967, 8.06020004070592, 8.71621217115462, 9.41463887166305, 10.163328807752, 10.9689152542477, 11.8331699231994, 12.7566491359618, 13.7399092138897, 14.783506478338, 15.8877756023413, 17.0479533475697, 18.254178564329, 19.4963684546043, 20.7644402203811, 22.0483110636448, 23.3368154616899, 24.6144569930464, 25.8646565115534, 27.07083487105, 28.2164129253751, 29.2848459145735, 30.2603799614208, 31.1280520714228, 31.8729336362912, 32.4800960477379, 32.9346106974744, 33.2229344326633, 33.33706592227, 33.2703892907107, 33.0162886624017, 32.5681481617592, 31.9195773795413, 31.0693716323692, 30.0215119627273, 28.7802048794415, 27.3496568913384, 25.7340745072439, 23.939275491331, 21.9775226291594, 19.8626899616355, 17.6086515296656, 15.2292813741561, 12.7385709973978, 10.153213513519, 7.49260364848593, 4.77625358964919, 2.02367552435912, -0.745618360033754, -3.5122785079423, -6.25760589083342, -8.96306411193715, -11.6101167744838, -14.1802274817035, -16.6550294974636, -19.0200582802881, -21.2647514833568, -23.3787164204875, -25.3515604054971, -27.1728907522033, -28.8342453001256, -30.3348839915929, -31.6759972946368, -32.8587756772887, -33.8844096075799, -34.7542687297092, -35.4738437397274, -36.0527463855374, -36.5007675912098, -36.8276982808148, -37.0433293784224, -37.157717968495, -37.1819857770595, -37.1275206905347, -37.0057105953392, -36.8279433778919, -36.6055169318738, -36.3476593180057, -36.0615287640475, -35.7541935050218, -35.4327217759511, -35.1041818118577), 
    .Dim = c(100L, 1L), .Dimnames = list(NULL, "pd_2"))

Все они сосредоточены вокруг нуля, но распределение вокруг нуля отличается между кривыми, то есть самое низкое значение изменяется между кривыми, так что это не так просто, как, скажем, добавить 55 к каждому значению, потому что в идеале самое низкое число для каждого было бы в нуле. Фактическое значение кривых не имеет значения, они интересны только относительно друг друга. Как вы можете пакетно переместить все кривые выше нуля, сохранив их общие размеры относительно друг друга?

Таким образом, цель состоит в том, чтобы переместить каждую кривую так, чтобы ее наиболее отрицательное значение было равно нулю, учитывая, что наиболее отрицательное значение изменяется для каждой кривой.

редактировать: Гэвин предложил это решение

Скажем, у нас есть модель m <- gam (y ~ s (x), data = foo), тогда мы можем предсказать из модели набор новых значений x, x 'в диапазоне x. Новые значения идут в newd: newd <- with (foo, data.frame (x = seq (min (x), max (x), length = 200))). И мы прогнозируем, используя функцию gnast (), добавляя прогнозируемые значения в newd: newd <- transform (newd, fit = предикат (m, newdata = newd, type = "response")). Теперь вы можете нанести график с помощью plot (fit ~ x, data = newd, type = "l"), и вы увидите кривые в соответствующем масштабе.

Что теперь работает, когда Гэвин также исправил мою формулу (см. Комментарии): test.gam<-gam (ch1 ~ s (row_id), data = test)

newd<-with (test, data.frame (row_id = seq (min (row_id), max (row_id), length = 1197)))

newd<-transform (newd, подогнанный = предикат (test.gam, newdata = newd, type = "response"))

Спасибо, Гэвин!

1 ответ

Если ваши кривые находятся в списке:

l = list(a = curve1, b = curve2) # ...etc...

пытаться lapply чтобы превратить это в список кривых, где минимум равен нулю:

l.min.zero = lapply(l, function(x) x - min(x))
Другие вопросы по тегам