【问题标题】:Extrapolation in RR中的外推
【发布时间】:2018-08-22 18:34:49
【问题描述】:

我有一个参考数据集,p

p=structure(list(v = 0:26, t = c(Inf, 1.016, 0.568, 0.418666666666667, 
0.344, 0.2992, 0.269333333333333, 0.248, 0.232, 0.219555555555556, 
0.2096, 0.201454545454545, 0.194666666666667, 0.188923076923077, 
0.184, 0.179733333333333, 0.176, 0.172705882352941, 0.169777777777778, 
0.167157894736842, 0.1648, 0.162666666666667, 0.160727272727273, 
0.15895652173913, 0.157333333333333, 0.15584, 0.154461538461538
)), .Names = c("v", "t"), row.names = c(NA, -27L), class = "data.frame")

p$vp$t有如下关系:

t=(0.16*(0.75*v + 5.6))/v

我的第二个数据集是测量数据w,包含相同的变量,如:

w=structure(list(v = c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26), t = c(0.235291176470588, 
0.354020375722543, 0.310974343434343, 0.25272725498699, 0.20351968240702, 
0.163155804025208, 0.132330740162655, 0.108593108108108, 0.0859813015873016, 
0.0655131899302683, 0.0492580103144236, 0.0368029846567365, 0.030538003253355, 
0.0300744415648525, 0.0347586421891237, 0.0451097744360902, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("v", "t"
), row.names = c(NA, -27L), class = "data.frame")

我的参考数据p,遵循幂律,我想根据幂律拟合数据进行预测,以替换我测量数据上的NA。我怎么能在 R 中做到这一点?

【问题讨论】:

    标签: r regression nls extrapolation


    【解决方案1】:

    这样的事情怎么样?

    # Non-linear power law fit
    fit.nls <- nls(
        t ~ a * v^b,
        data = w[-1, ],
        start = list(a = 0.4, b = -0.7),
        na.action = na.exclude);
    # Linear fit with log-log transformation
    fit.lm <- lm(
        log(t) ~ log(v),
        data = w[-1, ])
    
    # Plot
    w %>%
        rename(t.src = t) %>%
        mutate(
            t.pred.nls = predict(fit.nls, data.frame(v = v)),
            t.NA.pred.nls = ifelse(
                is.na(t.src),
                predict(fit.nls, data.frame(v = v)),
                t.src),
            t.pred.lm = exp(predict(fit.lm, data.frame(v = v)))) %>%
    gather(source, t, 3:5) %>%
    ggplot(aes(v, t, colour = source)) +
        geom_line() +
        geom_point(aes(v, t.src), colour = "black") +
        scale_colour_manual(values = c(
            "t.NA.pred.nls" = "black",
            "t.pred.nls" = "blue",
            "t.pred.lm" = "red"));
    

    黑点显示实际测量值。蓝色曲线为幂律非线性模型拟合,红色曲线为对数变换后的线性拟合;黑色曲线对应于您的原始数据,其中v = NA 值已替换为非线性模型拟合估计值(因此对于v &gt; 15,黑色和蓝色曲线重叠)。

    【讨论】:

    • 感谢您的回复,我有什么办法可以预测将NA 中的w 替换为顶部的条件,即斜率或趋势应该与我所拥有的相似在我的参考数据中,p ?
    • “顶部有一个条件,即斜率或趋势应该与我在参考数据中的相似,p” 不确定您的意思。你如何定义“相似”?我正在拟合 LOESS 曲线,它试图拟合两个变量之间的平滑曲线。关键是您不对全局趋势做出任何假设(因此是局部多项式回归中的“局部”)。我仍然不确定您要做什么。不能使用显式函数形式t = f(t) 替换w$t 中的NA 值吗?也许你追求的是一个非线性回归模型?
    • 如果您查看p 数据集,它看起来像是幂律。我想在w 中替换NA,最终得到一个平滑的幂律。通过使用 LOESS,它返回一个抛物线,而另一个 f &lt;- function(v) (0.16 * (0.75 * v + 5.6)) / v; w$t[is.na(w$t)] &lt;- f(w$v[is.na(w$t)]); 具有不连续性
    • 是的,这就是我要求您澄清的原因。因此,您希望为数据拟合基于幂律的非线性函数,并使用该模型替换 NA 值。请编辑您的帖子以包含这些详细信息。
    • @user9112767 我已经修改了我的解决方案,请看一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2019-12-06
    • 2019-05-08
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多