zoukankan      html  css  js  c++  java
  • R 中使用lm进行非线性拟合

    以前只是知道R 中的lm函数能够做线性拟合,恰如函数的名字:lm= linear model

    不过今天需要做非线性拟合的时候, 上网搜各种函数,包括nls、nlm等等,不过nlm的用法好像和一般的建模函数不太相同;nls函数的用法倒很像,可是却总是出error,不知道为什么。再次苦找,忽然发现其实lm函数便可以完成这个工作:

    lm函数进行非线性拟合的本质是在其中加入非线性的变量,对这些非线性的变量进行线性拟合,结果还是非线性的。

    library(car)
    plot(USPop)
    lmfit = lm(population ~ year, data = USPop) #线性拟合
    lines(USPop$year, predict(lmfit))
    nlmfit1 = lm(population ~ I(year^2)+year , data = USPop) #这里把一个平方项year^2用I来标记成一个变量
    nlmfit1
    summary(nlmfit1)
    lines(USPop$year, predict(nlmfit1), col = 'red')  #非线性拟合

    再上一个例子,是自己研究中的:

    Type_Num = as.numeric(Type_Fac)
    nlm = lm(Gene_Data ~ I(exp(-Type_Num))) #这里把一个指数函数用I包装成为线性拟合函数lm的一个变量
    #nlm
    summ_nlm = summary(nlm)
    summ_nlm
    nlm_pval = summ_nlm$coefficients[2,4]
    #lm
    fit_all = lm(Gene_Data ~ as.numeric(as.factor(Type)))
    summ_all = summary(fit_all)
    lmpval_all = summ_all$coefficients[2,4]
    #make plot
    plot(Gene_Data ~ (Type_Fac), xlab = 'Stage', ylab = 'Expression of Gene', 
         main = paste('Gene Expression vs Stage\n', 'non linear model pval for stages = ', nlm_pval,
                      '\n linear model pval for stages = ', lmpval_all))
    
    points(Gene_Data ~ Type_Fac)
    #add fitted lines
    x = seq(.5,5.5,.001)
    y =  17.2373 *exp(- x) +7.8884
    head(y)
    lines(x, y)  #non linear line
    y2 = 15.7728 - 2.1422 * x
    lines(x, y2) #linear line

    我们可以看到: 非线性拟合的程度更好!

  • 相关阅读:
    redis requires Ruby version >= 2.2.2.
    redis-持久化、主从复制、集群
    lucene索引文件大小优化小结
    spring+websocket的整合实例--可使用
    使用nexus3.10搭建maven私有仓库
    oracle 查看所有表的数据量并排序
    Spring框架-经典的案例和demo,一些可以直接用于生产,使用atomikos来处理多数据源的一致性事务等
    ORACLE WITH AS 用法
    判断对象部分属性是否为空
    代码行数统计
  • 原文地址:https://www.cnblogs.com/foreverycc/p/3023366.html
Copyright © 2011-2022 走看看