Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无需编写显式公式即可拟合R中的泛次多元多项式_R_Regression - Fatal编程技术网

无需编写显式公式即可拟合R中的泛次多元多项式

无需编写显式公式即可拟合R中的泛次多元多项式,r,regression,R,Regression,我想把任意次数的多元多项式和任意数量的变量拟合到一些数据中。变量的数量可能很高(例如40个),代码应该适用于不同数量的变量(例如10、20、40等),因此不可能显式写出公式。对于1次多项式(即,经典线性模型),解决方案很简单:假设我的数据在数据帧df中,那么 mymodel <- lm(y ~ ., data = df) mymodel您可以使用此函数makepoly,该函数基于公式和数据帧生成具有多项式项的公式 makepoly <- function(form, data, d

我想把任意次数的多元多项式和任意数量的变量拟合到一些数据中。变量的数量可能很高(例如40个),代码应该适用于不同数量的变量(例如10、20、40等),因此不可能显式写出公式。对于1次多项式(即,经典线性模型),解决方案很简单:假设我的数据在数据帧df中,那么

mymodel <- lm(y ~ ., data = df)

mymodel您可以使用此函数
makepoly
,该函数基于公式和数据帧生成具有多项式项的公式

makepoly <- function(form, data, degree = 1) {
  mt <- terms(form, data = data)
  tl <- attr(mt, "term.labels")
  resp <- tl[attr(mt, "response")]
  reformulate(paste0("poly(", tl, ", ", degree, ")"), 
              response = form[[2]])
}

makepoly这在假设的情况下结合了我先前发布的两个选项(交互和多项式术语),其中列名看起来像“X1”、“X2”、“X30”。您可以执行terms()调用,该调用就在这里,以证明它是成功的:

terms( as.formula( 
     paste(" ~ (", paste0("X", 1:30 , collapse="+"), ")^2", "+", 
            paste( "poly(", paste0("X", 1:30), ", degree=2)", 
                    collapse="+"), 
          collapse="")
      )         )
您可以使用类似于
names(dfrm)[!names(dfrm)%in%“y”]
的表达式,而不是内部的
paste0
调用

请注意,相互作用项是通过R公式过程和(…)^2机制构建的,该机制不是创建平方项,而是所有双向相互作用:

as.formula( 
        paste(" ~ (", paste0("X", 1:30 , collapse="+"), ")^2", "+", paste( "poly(", paste0("X", 1:30), ", degree=2)", collapse="+"), collapse="")
        ) 
#----output----
~(X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10 + X11 + X12 + 
    X13 + X14 + X15 + X16 + X17 + X18 + X19 + X20 + X21 + X22 + 
    X23 + X24 + X25 + X26 + X27 + X28 + X29 + X30)^2 + poly(X1, 
    degree = 2) + poly(X2, degree = 2) + 
    poly(X3, degree = 2) + 
    poly(X4, degree = 2) + poly(X5, degree = 2) + poly(X6, degree = 2) + 
    poly(X7, degree = 2) + poly(X8, degree = 2) + poly(X9, degree = 2) + 
    poly(X10, degree = 2) + poly(X11, degree = 2) + poly(X12, 
     degree = 2) + poly(X13, degree = 2) + poly(X14, degree = 2) + 
    poly(X15, degree = 2) + poly(X16, degree = 2) + poly(X17, 
     degree = 2) + poly(X18, degree = 2) + poly(X19, degree = 2) + 
    poly(X20, degree = 2) + poly(X21, degree = 2) + poly(X22, 
     degree = 2) + poly(X23, degree = 2) + poly(X24, degree = 2) + 
    poly(X25, degree = 2) + poly(X26, degree = 2) + poly(X27, 
     degree = 2) + poly(X28, degree = 2) + poly(X29, degree = 2) + 
    poly(X30, degree = 2)

嗨,斯文,我认为这不对。2个变量的三次多项式有10个系数,而不是7个。我认为你遗漏了交互术语,即x1*x2,x1*x3,x2*x3。我认为这是对前面问题的回答。双向相互作用和多项式项构造均已演示。感谢您的提示,但该答案不起作用…尝试
项(如.formula(粘贴(“~”,粘贴0(“X”),1:3,collapse=“+”)^2”,collapse=“”))
您将看到只包含线性项和相互作用项,而不包含二次项。太遗憾了,太近了……我将在答题板上演示。你应该注意到有两个选项,你需要结合它们来满足你的特殊要求。我对此不确定
poly(X2,度=2)
不是术语X2^2。它是一个二次正交多项式(请参见
help(poly)
)。我现在无法检查,但星期一我将验证在一个简单的双变量情况下是否适合您的公式,即,
as.formula(粘贴(“~”,paste0(“X”,1:2,collapse=“+”)”)^2“,“+”,粘贴(“poly”(,paste0(“X”,1:2)”,degree=2,raw=TRUE)”,collapse=“+”,collapse=“+”,collapse=“”)
返回与拟合显式公式
相同的系数。公式(“~(X1+X2)^2+I(X1^2)+I(X2^2)”)
。是的。我使用正交多项式来避免包含
I(x^2)等项的统计错误
。交互项和由多边形项创建的线性项之间可能存在重叠,但公式处理机制会识别并删除其中一个。请勿使用
I(x^2)
。哦,太好了,我不知道!那太好了。非常感谢!!另外,不要试图解释由具有交互项的模型产生的系数。它们本身基本上没有意义,你应该看看预测,比较大模型和简化模型之间的模型拟合差异。N我认为,所有这些都适用于2次多元多项式。在3次多项式的情况下,我将缺少诸如x1^2*x3的项。然而,现在我将使用这个解决方案。
terms( as.formula( 
     paste(" ~ (", paste0("X", 1:30 , collapse="+"), ")^2", "+", 
            paste( "poly(", paste0("X", 1:30), ", degree=2)", 
                    collapse="+"), 
          collapse="")
      )         )
as.formula( 
        paste(" ~ (", paste0("X", 1:30 , collapse="+"), ")^2", "+", paste( "poly(", paste0("X", 1:30), ", degree=2)", collapse="+"), collapse="")
        ) 
#----output----
~(X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10 + X11 + X12 + 
    X13 + X14 + X15 + X16 + X17 + X18 + X19 + X20 + X21 + X22 + 
    X23 + X24 + X25 + X26 + X27 + X28 + X29 + X30)^2 + poly(X1, 
    degree = 2) + poly(X2, degree = 2) + 
    poly(X3, degree = 2) + 
    poly(X4, degree = 2) + poly(X5, degree = 2) + poly(X6, degree = 2) + 
    poly(X7, degree = 2) + poly(X8, degree = 2) + poly(X9, degree = 2) + 
    poly(X10, degree = 2) + poly(X11, degree = 2) + poly(X12, 
     degree = 2) + poly(X13, degree = 2) + poly(X14, degree = 2) + 
    poly(X15, degree = 2) + poly(X16, degree = 2) + poly(X17, 
     degree = 2) + poly(X18, degree = 2) + poly(X19, degree = 2) + 
    poly(X20, degree = 2) + poly(X21, degree = 2) + poly(X22, 
     degree = 2) + poly(X23, degree = 2) + poly(X24, degree = 2) + 
    poly(X25, degree = 2) + poly(X26, degree = 2) + poly(X27, 
     degree = 2) + poly(X28, degree = 2) + poly(X29, degree = 2) + 
    poly(X30, degree = 2)