多元回归-model.frame.default变量长度不同的错误

时间:2019-03-02 07:21:06

标签: r model regression linear-regression

我正在尝试使用3个独立变量和3个因变量进行多元回归。这个问题是基于水质如何影响3个不同位置(又称高跷)之间的浮游生物的丰度。水质变量为pH,磷酸盐和硝酸盐。因变量/响应变量是每个3个位置中的浮游生物丰度。

这是我的代码:

model1 <- lm(cbind(Abundance[Guzzler.. == 1], Abundance[Guzzler.. == 2], 
                   Abundance[Guzzler.. == 3]) ~ Phospates + Nitrates + pH, 
             data=WQAbundancebyGuzzler)

这是我收到的错误消息:

Error in model.frame.default(formula = cbind(Abundance[Guzzler.. == 1],  : 
  variable lengths differ (found for 'Phospates')    

我认为这与我的数据的设置有关,但是我不确定如何进行更改以使模型运行。我想看看的是这些水质变量如何影响不同位置的丰度以及它们之间如何变化。因此,尝试多个模型似乎不太合逻辑,这是我唯一的其他想法。

这是dput(head(WQAbundancebyGuzzler))的输出:

    structure(list(ï..Date = structure(c(2L, 4L, 1L, 3L, 5L, 2L), .Label = c("11/16/2018", 
"11/2/2018", "11/30/2018", "11/9/2018", "12/7/2018"), class = "factor"), 
    Guzzler.. = c(1L, 1L, 1L, 1L, 1L, 2L), Phospates = c(2L, 
    2L, 2L, 2L, 2L, 1L), Nitrates = c(0, 0.3, 0, 0.15, 0, 0), 
    pH = c(7.5, 8, 7.5, 7, 7, 8), Air.Temp..C. = c(20.8, 25.4, 
    20.9, 16.8, 19.4, 27.4), Relative.Humidity... = c(62L, 31L, 
    41L, 59L, 59L, 43L), DO2.Concentration..mg.L. = c(3.61, 4.48, 
    3.57, 5.65, 2.45, 5.86), Water.Temp..C. = c(14.1, 11.5, 11.8, 
    13.9, 11.1, 17.8), Abundance = c(98L, 43L, 65L, 55L, 54L, 
    29L)), .Names = c("ï..Date", "Guzzler..", "Phospates", "Nitrates", 
"pH", "Air.Temp..C.", "Relative.Humidity...", "DO2.Concentration..mg.L.", 
"Water.Temp..C.", "Abundance"), row.names = c(NA, 6L), class = "data.frame")

2 个答案:

答案 0 :(得分:2)

我认为这里的问题更理论上:您说您有三个因变量要输入多元线性回归。但是,至少在经典线性回归中,只能有一个因变量。可能有一些解决方法,但是我认为在您的情况下,一个因变量就可以了:“丰度”。现在,您已经采样了三个不同的位置:解决此问题的一种解决方案是,只需将位置作为分类自变量输入即可。因此,我提出以下模型:

# Make sure that Guzzler is not treated as numeric
WQAbundancebyGuzzler$Guzzler <- as.factor(WQAbundancebyGuzzler$Guzzler)

# Model with 4 independent variables
model1 <- lm(Abundance ~ Guzzler + Phospates + Nitrates + pH, 
             data=WQAbundancebyGuzzler)

在这里考虑可能的相互作用,尤其是在Guzzler与其他自变量之间的相互作用,可能也是明智的选择。

答案 1 :(得分:0)

发生错误的原因是,您尝试仅对"Abundance"进行子集化,而不对其他变量进行子集化。因此,他们的身长有所不同。您需要对整个数据进行子集处理,例如

lm(Abundance ~ Phospates + Nitrates + pH, 
   data=WQAbundancebyGuzzler[WQAbundancebyGuzzler$Abundance %in% c(1, 2, 3), ])

使用给定的head(WQAbundancebyGuzzler)

lm(Abundance ~ Phospates + Nitrates + pH, 
   data=WQAbundancebyGuzzler[WQAbundancebyGuzzler$Abundance %in% c(29, 43, 65), ])

产生

# Call:
#   lm(formula = Abundance ~ Phospates + Nitrates + pH, data = WQAbundancebyGuzzler
#   [WQAbundancebyGuzzler$Abundance %in% 
#       c(29, 43, 65), ])
# 
# Coefficients:
#   (Intercept)    Phospates     Nitrates           pH  
#         -7.00        36.00       -73.33           NA