Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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_Linear Regression_Lm - Fatal编程技术网

R 如何手动设置线性模型中变量的系数?

R 如何手动设置线性模型中变量的系数?,r,linear-regression,lm,R,Linear Regression,Lm,在R中,如何设置特定变量的权重,而不是lm()函数中的观察值 上下文如下。我正在尝试为特定的产品建立个人排名系统,比如手机。我可以以价格为因变量,以屏幕大小、内存、操作系统等其他特性为自变量,建立线性模型。然后,我可以用它来预测手机的实际成本(相对于公布的价格),从而找到最佳的价格/优度系数。这是我已经做过的 现在我想突出显示一些只对我重要的功能。例如,我可能需要一个具有大内存的手机,因此我想赋予它更高的权重,以便线性模型针对内存变量进行优化 R中的lm()函数具有权重参数,但这些是观察值的权重

在R中,如何设置特定变量的权重,而不是
lm()
函数中的观察值

上下文如下。我正在尝试为特定的产品建立个人排名系统,比如手机。我可以以价格为因变量,以屏幕大小、内存、操作系统等其他特性为自变量,建立线性模型。然后,我可以用它来预测手机的实际成本(相对于公布的价格),从而找到最佳的价格/优度系数。这是我已经做过的

现在我想突出显示一些只对我重要的功能。例如,我可能需要一个具有大内存的手机,因此我想赋予它更高的权重,以便线性模型针对内存变量进行优化

R中的
lm()
函数具有
权重
参数,但这些是观察值的权重,而不是变量(如果这是错误的,请更正我)。我还试着玩弄公式,但只得到了解释错误。是否有方法将变量的权重合并到
lm()

当然,
lm()
函数不是唯一的选项。如果您知道如何使用其他类似的解决方案(例如
glm()
),这也很好

UPD.经过几次评论后,我明白我对这个问题的思考方式是错误的。通过调用
lm()
获得的线性模型为训练示例提供了最佳系数,并且没有办法(也没有必要)改变变量的权重,很抱歉我造成了混淆。我实际上在寻找的是改变现有线性模型中系数的方法,以手动方式使某些参数比其他参数更重要。继续上一个示例,假设我们得到了以下价格公式:

price = 300 + 30 * memory + 56 * screen_size + 12 * os_android + 9 * os_win8
这个公式描述了价格和电话参数之间相关性的最佳线性模型。但是,现在我想手动将
内存
变量前面的数字30更改为,例如,60,因此它变为:

price = 300 + 60 * memory + 56 * screen_size + 12 * os_android + 9 * os_win8
当然,这个公式不再反映价格和手机参数之间的最佳关系。此外,因变量并没有显示实际的价格,只是一些善良的价值,考虑到记忆对我的重要性是普通人的两倍(基于第一个公式的系数)。但这种善良的价值(或者更准确地说,是分数的价值)正是我所需要的——有了它,我可以找到价格最好的(在我看来)手机

希望所有这些都有意义。现在我有一个(可能很简单)问题。如何手动设置使用
lm()
获得的现有线性模型中的系数?也就是说,我在寻找这样的东西:

coef(model)[2] <- 60

coef(model)[2]看起来您正在进行优化,而不是模型拟合(尽管模型拟合中可能存在优化)。您可能需要类似于
optim
函数的功能,或者研究线性或二次规划(
linprog
quadprog
包)


如果您坚持使用建模工具,如
lm
,则使用公式中的
offset
参数指定您自己的乘数,而不是计算一个。

看起来您正在进行优化,而不是模型拟合(尽管模型拟合中可能存在优化)。您可能需要类似于
optim
函数的功能,或者研究线性或二次规划(
linprog
quadprog
包)


如果您坚持使用建模工具,如
lm
,则使用公式中的
offset
参数来指定您自己的乘数,而不是计算一个。

以下代码有点复杂,因为
lm()
最小化剩余平方和,并且使用固定的非最佳系数,它不再是最小值,因此,这与
lm()
试图做的是背道而驰的,唯一的方法就是修复所有剩余的系数

要做到这一点,我们必须先知道无约束模型的系数。所有的调整都必须通过改变模型的公式来完成,例如,我们有
price~内存+屏幕大小
,当然还有一个隐藏的截取。现在,无论是直接更改数据还是使用
I(c*内存)
都不是一个好主意
I(c*memory)
也类似于数据的临时更改,但是通过转换变量只更改一个系数要困难得多

因此,首先我们将
price~内存+屏幕大小
更改为
price~偏移量(c1*内存)+偏移量(c2*屏幕大小)
。但我们还没有修改截距,截距现在将尝试最小化剩余平方和,并且可能与原始模型不同。最后一步是删除截距并添加新的伪变量,即与其他变量具有相同数量的观测值:

price~offset(c1*内存)+offset(c2*屏幕大小)+rep(c0,长度(内存))-1

# Function to fix coefficients
setCoeffs <- function(frml, weights, len){
  el <- paste0("offset(", weights[-1], "*", 
               unlist(strsplit(as.character(frml)[-(1:2)], " +\\+ +")), ")")
  el <- c(paste0("offset(rep(", weights[1], ",", len, "))"), el)                                 
  as.formula(paste(as.character(frml)[2], "~", 
                   paste(el, collapse = " + "), " + -1"))
}
# Example data
df <- data.frame(x1 = rnorm(10), x2 = rnorm(10, sd = 5), 
                 y = rnorm(10, mean = 3, sd = 10))
# Writing formula explicitly 
frml <- y ~ x1 + x2
# Basic model
mod <- lm(frml, data = df)
# Prime coefficients and any modifications. Note that "weights" contains 
# intercept value too
weights <- mod$coef
# Setting coefficient of x1. All the rest remain the same
weights[2] <- 3
# Final model
mod2 <- update(mod, setCoeffs(frml, weights, nrow(df)))
# It is fine that mod2 returns "No coefficients"

下面的代码有点复杂,因为
lm()
最小化剩余平方和,并且对于固定的非最优系数,它不再是最小值,因此这与
lm()
试图做的是相反的,唯一的方法是也固定所有剩余系数

要做到这一点,我们必须先知道无约束模型的系数。所有的调整都必须通过改变模型的公式来完成,例如,我们有
price~内存+屏幕大小
,当然还有一个隐藏的截取。现在,无论是直接更改数据还是使用
I(c*内存)
都不是一个好主意
I(c*memory)
也类似于数据的临时更改,但是通过转换变量只更改一个系数要困难得多

所以首先我们改变
price~内存+屏幕
# Data for forecasting with e.g. price unknown
df2 <- data.frame(x1 = rpois(10, 10), x2 = rpois(5, 5), y = NA)
mat <- model.matrix(frml, model.frame(frml, df2, na.action = NULL))
# Forecasts
rowSums(t(t(mat) * weights))