计算衍生物&多项式的曲率

时间:2018-02-08 18:13:04

标签: r regression linear-regression lm polynomials

我有一个数据框,记录了一群人的皮肤温度随着时间的推移。我想:

  1. 将二次多项式拟合到if self.scrollView.contentOffset.y == 0 { myView.isHidden = true } else if self.scrollView.contentOffset.y > 0 { myView.isHidden = true } 上的每个id的SkinTemp;
  2. 计算曲率。
  3. 这似乎比它应该更难。

    我在Fitting a quadratic curve for each data set that has different lengths询问了第一部分,但我无法继续计算导数和曲率。

    Time

    现在我需要计算曲率df <- data.frame(Time = seq(65), SkinTemp = rnorm(65, 37, 0.5), id = rep(1:10, c(5,4,10,6,7,8,9,8,4,4))) #Predict data points for each quadratic fitted_models = df %>% group_by(id) %>% do(model = lm(SkinTemp ~ Time+I(Time^2), data = .)) ,其中k = y''/(1 + y' ^ 2) ^ (3 / 2)y'y''相对于y的一阶和二阶导数。

    我以为我可以要求x函数通过传递例如predict来给我衍生物,但它似乎不起作用。

    deriv = 2

    所以我修改了这个函数,它似乎工作正常但是没有内置函数来完成这个任务吗?

    predQ <- lapply(unique(df$id),
                    function(x) predict(deriv = 2,fitted_models$model[[x]])) 
    

1 个答案:

答案 0 :(得分:2)

您只是被多项式的导数计算所阻碍。如何使用在my this answer中定义的函数g

例如,您的第一个模型具有多项式系数:

pc <- coef(fitted_models[[2]][[1]])
#(Intercept)        Time   I(Time^2) 
#38.36702120 -0.61025716  0.04703084 

假设您只想评估观察位置的导数和曲率:

x <- with(df, Time[id == 1])
#[1] 1 2 3 4 5

然后您可以逐步进行分析计算:

## 1st derivative
d1 <- g(x, pc, 1)
#[1] -0.5161955 -0.4221338 -0.3280721 -0.2340104 -0.1399487

## 2nd derivative
d2 <- g(x, pc, 2)
#[1] 0.09406168 0.09406168 0.09406168 0.09406168 0.09406168

## curvature: d2 / (1 + d1 * d1) ^ (3 / 2)
d2 / (1 + d1 * d1) ^ (3 / 2)
#[1] 0.06599738 0.07355055 0.08069004 0.08683238 0.09136444

这不是比您的有限差分近似要好吗?


请注意,g也可以求值nderiv = 0L,即多项式本身:

g(x, pc, 0)
#[1] 37.80379 37.33463 36.95953 36.67849 36.49151

同意predict.lm

predict.lm(fitted_models[[2]][[1]], data.frame(Time = x))
#       1        2        3        4        5 
#37.80379 37.33463 36.95953 36.67849 36.49151 

函数g通过多项式系数向量pc的长度来判断多项式的阶数。长度为3的矢量表示度=2。它是为原始多项式而不是正交多项式设计的。


所有组的计算

要对所有组进行曲率计算,我将使用Map

polynom_curvature <- function (x, pc) {
  d1 <- g(x, pc, 1L)
  d2 <- g(x, pc, 2L)
  d2 / (1 + d1 * d1) ^ (3 / 2)
  }

pc_lst <- lapply(fitted_models[[2]], coef)
Time_lst <- split(df$Time, df$id)
result <- Map(polynom_curvature, Time_lst, pc_lst)
str(result)
#List of 10
# $ 1 : num [1:5] 0.066 0.0736 0.0807 0.0868 0.0914
# $ 2 : num [1:4] -0.106 -0.12 -0.131 -0.135
# $ 3 : num [1:10] 0.0795 0.0897 0.0988 0.1058 0.1095 ...
# $ 4 : num [1:6] -0.098 -0.107 -0.113 -0.115 -0.112 ...
# $ 5 : num [1:7] -0.0878 -0.0923 -0.0946 -0.0944 -0.0917 ...
# $ 6 : num [1:8] 0.0752 0.0811 0.0857 0.0886 0.0895 ...
# $ 7 : num [1:9] 0.0397 0.0405 0.0411 0.0414 0.0416 ...
# $ 8 : num [1:8] 0.0178 0.018 0.0182 0.0184 0.0185 ...
# $ 9 : num [1:4] -0.151 -0.161 -0.159 -0.146
# $ 10: num [1:4] 0.1186 0.1129 0.1033 0.0917