Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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 在应用函数之前从lm对象提取数据的方法?_R_Lm - Fatal编程技术网

R 在应用函数之前从lm对象提取数据的方法?

R 在应用函数之前从lm对象提取数据的方法?,r,lm,R,Lm,让我直接进入一个例子来说明我的问题: rm(list=ls()) n <- 100 df <- data.frame(y=rnorm(n), x1=rnorm(n), x2=rnorm(n) ) fm <- lm(y ~ x1 + poly(x2, 2), data=df) rm(list=ls()) 好问题,但这很难fm$model是一种奇怪的数据帧,用户很难构建这种类型的数据帧,但R有时会在内部生成这种数据帧。查看str(fm$model)的前几行,这表明它是一个

让我直接进入一个例子来说明我的问题:

 rm(list=ls())
 n <- 100
 df <- data.frame(y=rnorm(n), x1=rnorm(n), x2=rnorm(n) )
 fm <- lm(y ~ x1 + poly(x2, 2), data=df)
rm(list=ls())

好问题,但这很难
fm$model
是一种奇怪的数据帧,用户很难构建这种类型的数据帧,但R有时会在内部生成这种数据帧。查看
str(fm$model)
的前几行,这表明它是一个数据帧,其第三个组件是一个具有维度(100,2)的多边形类对象,即类似矩阵的对象:

## 'data.frame':    100 obs. of  3 variables:
##  $ y          : num  -0.5952 -1.9561 1.8467 -0.2782 -0.0278 ...
##  $ x1         : num  0.423 -1.539 -0.694 0.254 -0.13 ...
##  $ poly(x2, 2): poly [1:100, 1:2] 0.0606 -0.0872 0.0799 -0.1068 -0.0395 ...
如果您仍然在最初调用
lm
的环境中工作,并且如果使用
data
参数调用了
lm
,则可以使用
eval(getCall(fm)$data)
获取原始数据。如果在函数中传入和传出内容,或者如果有人在环境中的独立对象上使用了
lm
,那么您可能运气不好。如果你遇到麻烦,你可以试试

eval(getCall(fm)$data,environment(formula(fm))
但事情很快变得越来越困难


我不完全理解存储处理后的模型框架而不是原始数据的逻辑,但我认为这与线性模型的
术语
对象的构造有关——存储的模型框架中的每个元素对应于
术语
对象的一个元素。我真的不明白因素与转换数据(例如,
log(x)
)或特殊对象(如多项式或样条线基)之间的区别,这些因素是由
model.matrix
后处理为一组虚拟变量的,问题是,你有多需要它。如果您查看
fm$model$poly
的结构,那么最后您将看到如下内容:

attr(,"coefs")
attr(,"coefs")$alpha
[1] 0.06738858 0.10887048

attr(,"coefs")$norm2
[1]   1.00000 100.00000  93.96666 155.01387
我想这些系数可以用来从多边形恢复原始数据。查看
poly
功能的源代码(要么
page(poly)
,要么在控制台中键入
poly
)。。。看起来多项式的计算可能是可逆的。但是为什么要费心去做呢?我能想到两个原因:(1)你失去了原始数据和唯一的方法 恢复它就是这样;(2) 您想了解R如何计算正交多项式

第二,更一般地说,因为我没有明确要求 matrix(fm),为什么我会得到被操纵的数据?是什么 这背后的基本理念是什么?有人知道吗

您的意思是,为什么要使用
lm
对象保存数据?我想是以防万一吧。您可以轻松地将其关闭:

fm <- lm(y ~ x1 + poly(x2, 2), data=df, model=FALSE)

您可以看到fm$model有factor(b)而不是b,fm$model$factor实际上是一个factor,而不是原始的整数变量。(警告是因为名称实际上是
factor(b)
,我使用
factor
来避免键入像fm$model$'factor(b)'这样难看的内容(用反引号替换单引号).

我的动机是试图编写一个小函数,该函数以lm对象为参数并进行一些计算。使用lm对象中已存储的数据似乎更节省内存,坦率地说,更优雅,这就是我尝试此方法的原因。R在这里的行为让我感到困惑。例如,使用
factor(f)
对于某些附加因子变量,它不会转换为存储在
fm$model
中的数据帧。只有实际变量
f
存储在
fm$model
中,而在本例中,使用
poly
时,会存储一些转换。这让我感到困惑。很抱歉,响应太晚。我没有得到通知当有人编辑他或她的答案,所以我错过了它…不管怎样,重点放在这里!我只是看到原始数据在那里(以因子级别的形式),我确实没有注意到数据结构本身发生了变化。因此,每当函数应用于回归中的变量时,
fm$model
会在应用函数后存储数据,因此原始数据很难以自动方式检索,我猜……无论如何,感谢您的回答!这对d、 剩下的一点仍然令人费解的是
head(new.dat)
View(new.dat)
显示了不同的东西。如果你知道那里可能发生了什么……看看
str(new.dat)
——你会发现这不是一个简单的数据帧,因为它的一个“列”实际上是一个二维对象(类
poly
但实际上是一个具有一些额外属性的矩阵)。看来RStudio不擅长显示此类数据,head()是对的,View()是错的。比较
df1 Ah,这是RStudio的事情。谢谢,我没有想象到。我认为一些内部R的事情正在发生。。。
fm <- lm(y ~ x1 + poly(x2, 2), data=df, model=FALSE)
> df <- data.frame(a=1:5, b=2:6, c=rnorm(5))
> fm <- lm(c~ a + factor(b), df)
> fm$model
           c a factor(b)
1  0.5397541 1         2
2  0.9108087 2         3
3  0.1819442 3         4
4 -0.9293893 4         5
5  0.1404305 5         6
> fm$model$factor
[1] 2 3 4 5 6
Levels: 2 3 4 5 6
Warning message:
In `$.data.frame`(fm$model, factor) : Name partially matched in data frame