Warm tip: This article is reproduced from serverfault.com, please click

其他-运行包含线性模型的R函数时遇到的问题

(其他 - Problems getting an R-function with linear model included to run)

发布于 2020-11-28 10:33:14

我想在R中创建一个函数,该函数可以应用于生物学数据以进行尺寸校正。我的数据如下所示:

数据快照

结构(列表(ID =结构(c(1L,12L,23L,34L,45L,56L,66L,67L,68L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,13L)) ,.Label = c(“ rat1”,“ rat10”,“ rat11”,“ rat12”,“ rat13”,“ rat14”,“ rat15”,“ rat16”,“ rat17”,“ rat18”,“ rat19”, “ rat2”,“ rat20”,“ rat21”,“ rat22”,“ rat23”,“ rat24”,“ rat25”,“ rat26”,“ rat27”,“ rat28”,“ rat29”,“ rat3”,“ rat30” “,” rat31“,” rat32“,” rat33“,” rat34“,” rat35“,” rat36“,” rat37“,” rat38“,” rat39“,” rat4“,” rat40“,” rat41“, “ rat42”,“ rat43”,“rat44”,“ rat45”,“ rat46”,“ rat47”,“ rat48”,“ rat49”,“ rat5”,“ rat50”,“ rat51”,“ rat52”,“ rat53”,“ rat54”,“ rat55” ,“ rat56”,“ rat57”,“ rat58”,“ rat59”,“ rat6”,“ rat60”,“ rat61”,“ rat62”,“ rat63”,“ rat64”,“ rat65”,“ rat66”,“ rat67”,“ rat68”,“ rat7”,“ rat8”,“ rat9”),类别=“因子”),种群=结构(c(1L,1L,1L,2L,2L,2L,1L,1L,1L ,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L),.Label = c(“ A”,“ B”),class =“ factor”),size = c(39.72 ,46.72、38.37、40.8、46.57、35.93、51.69、40.97、45.39、43.67、43.68、39.2、45。07,42.11,46.91,45.99,42.43,41.36,42.54,38.41),特征= c(3.657,4.096,3.186,4.286,3.901,2.882,4.666,4.635,4.93,4.264,4.329,3.493,5.142,4.859,4.272 ,3.5、4.199、4.434、4.278、3.211)),row.names = c(NA,20L),class =“ data.frame”)

这里的功能:

    sizecorr=function(input_data,input_trait){
        x = input_data 
        xnew = x 
        xnew$size = mean(x$size)
        z = lm(input_trait ~ size + population, data = x, na.action = na.exclude)
        res = residuals(z)
        yhat = predict(z,xnew)
        m = (res+yhat)
        }

但是,当我现在像这样在我的数据上运行此功能时

sizecorr(d,"trait")

我总是会收到此错误:

model.frame.default中的错误(公式= input_trait〜大小+总体,:可变长度不同(针对“大小”找到)

数据都是干净的(没有丢失的数据)并且格式正确。有人可以找出问题所在吗?

Questioner
8armed
Viewed
0
Ronak Shah 2020-11-28 19:02:02

你正在将字符串输入传递给该函数。使用as.formulareformula构造公式。你还真的需要这么多数据副本吗?input_dataxxnew)。

sizecorr=function(input_data,input_trait){
  x = input_data 
  xnew = x
  xnew$size = mean(x$size)
  z = lm(reformulate(c('size', 'population'), input_trait), 
         data = x, na.action = na.exclude)
  res = residuals(z)
  yhat = predict(z,xnew)
  m = (res+yhat)
  m
}
sizecorr(d,"trait")