表面R的方程

3

在航空工程中,高度(Z)与起飞平面之上的高度有关:

  1. 起飞开始时的下滑距离(X)
  2. 满载飞机使用的跑道长度(Y)。

我们希望从已知x和y值的观察点z的数组中找到z=f(x,y)。 z在x和y方面是线性的。当前的解决方案涉及拟合一组函数z=f(x)。然后,使用家族中的系数进行第二次回归以获得z=f(x,y)。我猜想有更好的方法可以做到这一点。这段代码已经存在一段时间,可能是拼凑而成,从未被重新思考过。观察结果如下: 爬升性能

获取f(x,y)的代码如下:

X <- seq(6000,10000,1000);
Y <- seq(4000,6000,500);

Z <- c(145, 200, 254, 307, 360,
       118, 165, 213, 260, 310,
        90, 130, 172, 213, 254,
        67, 102, 137, 175, 210,
        50,  80, 110, 140, 170);
dim(Z) <- c(5,5);

Fxy <- coef( lm( t( coef( lm( Z ~ X ) ) ) ~ Y ) );  #2x2 matrix

x <- c(1,6000);  # test values
y <- c(1,4000);

z <- y %*% Fxy %*% x;
z;

这个解决方案很好,但似乎应该有一种方法可以不使用顺序回归来实现。 值得一提的是,X和Y的长度并不总是相同的,Z也不总是正方形的。 我们这里没有R高手,但有很多好奇的人使用了各种公式,包括二次和指数函数。如果有一种“正确”的方法,我们将在所有代码中使用它。

谢谢。

1个回答

0
如果你的响应Z与x或y之一呈线性关系,那么你可以使用交互项x:y进行多元线性回归。
# make a data frame containing all observations
df <- expand.grid(x = X, y = Y)
df$z <- c(Z)

# fit a linear model with interaction term
fit <- lm(z ~ x + y + x:y, data = df)
# alternatively
fit <- lm(z ~ x * y, data = df) # see ?lm

# Call:
# lm(formula = z ~ x + y + x:y, data = df)
# 
# Coefficients:
# (Intercept)            x            y          x:y  
# -2.703e+02    1.011e-01    2.276e-02   -1.188e-05  


# predict
df.test <- cbind.data.frame(x = x, y = y)
predict(fit, newdata = df.test)

# the results is the same: one value for one obs
# 1         2 
# -270.1561  142.3600 

此外,如果您的数据包含缺失值(长度不相等,不是方阵...),我认为最好将它们组织成数据框以更好地管理数据,其中每一行代表相关观测记录。

谢谢,我会尝试一下。独立观察的数据框架也是一个好主意,虽然它将有几个X和Y的副本。这实际上是最有趣的收获。如果数据结构是这样的,X与Y的长度就不相关了。 - user3791453

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接