【问题标题】:Multiple Regression - Error in model.frame.default variable lengths differ多重回归 - model.frame.default 可变长度中的错误不同
【发布时间】:2019-07-24 04:02:06
【问题描述】:

我正在尝试使用 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")

【问题讨论】:

  • 欢迎来到堆栈溢出!为了帮助您,我们需要一些东西来重现您的问题。即工作代码和示例数据。有几个ways to provide data,可能在您的问题中添加dput(WQAbundancebyGuzzler)dput(head(WQAbundancebyGuzzler)) 的输出就足够了。避免将代码或字母数字输出添加为图像。考虑How to make a great reproducible example 并编辑您的问题,谢谢。
  • @jay.sf 非常感谢您的提示!我已经继续并添加了 dput(head(WQAbundancebyGuzzler)) 的输出
  • 您应该使用 Guzzler.. 作为 RHS 的一个因素。

标签: r model regression linear-regression


【解决方案1】:

我认为这里的问题更具理论性:您说您有三个因变量要进入多元线性回归。但是,至少在经典线性回归中,因变量只能有一个。可能有办法解决这个问题,但我认为在你的情况下,一个因变量工作得很好:它是“丰度”。现在您已经对三个不同的位置进行了抽样:解决此问题的一种解决方案可能是将位置作为分类自变量输入。所以我会提出以下模型:

# 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 和其他自变量之间的交互。

【讨论】:

    【解决方案2】:

    您错误的原因是,您尝试仅对 "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  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多